- 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', '44e597d0-0d5f-4731-aa42-5d7bf2663007') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '44e597d0-0d5f-4731-aa42-5d7bf2663007') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '44e597d0-0d5f-4731-aa42-5d7bf2663007') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '44e597d0-0d5f-4731-aa42-5d7bf2663007') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'addd9a39-81d8-4f2d-80fb-246a9b9a10ea') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'addd9a39-81d8-4f2d-80fb-246a9b9a10ea') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'addd9a39-81d8-4f2d-80fb-246a9b9a10ea') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'addd9a39-81d8-4f2d-80fb-246a9b9a10ea') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-77d8b56a-f3b4-4e64-a1bf-d16d6e275772') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-77d8b56a-f3b4-4e64-a1bf-d16d6e275772') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-77d8b56a-f3b4-4e64-a1bf-d16d6e275772') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-77d8b56a-f3b4-4e64-a1bf-d16d6e275772') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-3aee758e-4963-454e-8d51-c6665361f62f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-3aee758e-4963-454e-8d51-c6665361f62f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-3aee758e-4963-454e-8d51-c6665361f62f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-3aee758e-4963-454e-8d51-c6665361f62f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-48908765-79a6-48a9-9b46-8db18ea6a97d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-48908765-79a6-48a9-9b46-8db18ea6a97d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-48908765-79a6-48a9-9b46-8db18ea6a97d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-48908765-79a6-48a9-9b46-8db18ea6a97d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dab9f6ec-9349-45cc-88bc-46fad0373f37') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dab9f6ec-9349-45cc-88bc-46fad0373f37') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dab9f6ec-9349-45cc-88bc-46fad0373f37') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dab9f6ec-9349-45cc-88bc-46fad0373f37') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-635daf66-6a73-4fca-9727-68a2b903b59e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-635daf66-6a73-4fca-9727-68a2b903b59e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-635daf66-6a73-4fca-9727-68a2b903b59e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-635daf66-6a73-4fca-9727-68a2b903b59e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfbdffaa-0217-4588-a89a-f5ea00d9cb12') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfbdffaa-0217-4588-a89a-f5ea00d9cb12') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfbdffaa-0217-4588-a89a-f5ea00d9cb12') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfbdffaa-0217-4588-a89a-f5ea00d9cb12') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dec4eeca-4154-41f4-9e35-ecb0039b9bb9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dec4eeca-4154-41f4-9e35-ecb0039b9bb9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dec4eeca-4154-41f4-9e35-ecb0039b9bb9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dec4eeca-4154-41f4-9e35-ecb0039b9bb9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a367c5df-3466-4243-afee-99b0d5b18fe0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a367c5df-3466-4243-afee-99b0d5b18fe0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a367c5df-3466-4243-afee-99b0d5b18fe0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a367c5df-3466-4243-afee-99b0d5b18fe0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta estupenda visualización de MAQ LLC nos permite llevar eventos (definidos por una fecha de comienzo y otra de finalización) a un calendario. Los campos que nos permiten configurar la visualización son los mostrados en la siguiente imagen:
Los únicos campos requeridos son <em>Start date</em> (fecha de comienzo de cada evento) y <em>Events</em> (eventos a mostrar en el calendario). Este último campo deberá necesariamente contener cadenas de texto (no es posible mostrar números, por ejemplo).
Para ver cómo funciona vamos a partir de los siguientes datos:
Vemos que se trata de una tabla con asignaciones de empleados a diferentes tareas limitadas en el tiempo por una fecha de arranque y otra de finalización, tabla que incluye el rol del empleado en cuestión en el campo <em>Category</em> (un mismo empleado puede ser asignado a diferentes tareas con diferentes roles).
El campo <em>Id</em> enlaza esta tabla con la tabla de empleados en la que incluye, entre otros datos, el nombre completo de cada uno.
Comencemos creando una instancia del calendario en el lienzo de Power BI y arrastrando el campo <em>Start</em> de la tabla anterior al campo <em>Start date</em> de la visualización, y el campo <em>Full name</em> de nuestra tabla de empleados al campo <em>Events</em> de la visualización. Ésta mostrará 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/calendar_by_maq_03.jpg"></a>
Es decir, si no se añade el campo <em>End date</em>, la visualización presupone que se trata de eventos de un solo día. Los "eventos" (en nuestro caso definidos por el nombre de un trabajador) se muestran en el bloque correspondiente a cada día. Vemos que solo se muestran un máximo de 2 eventos por día: en la imagen anterior, en el recuadro correspondiente al día 12, por ejemplo, hay una etiqueta "+3 more" que indica que hay otros 3 eventos que no se están mostrando. Un clic encima de dicha etiqueta abre una ventana emergente con la lista completa de eventos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_04.jpg"></a>
Desafortunadamente no es posible modificar el número de eventos a mostrar por día, ni configurar el tamaño de dicho texto (con la esperanza de que quepan más líneas). Tampoco haciendo la visualización más alta o más estrecha se modificará la altura de los recuadros que representan los días.
Si añadimos al campo <em>End date</em> de la visualización el campo con la fecha de terminación de cada evento (campo <em>End</em> de nuestra tabla), 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-08/calendar_by_maq_05.jpg"></a>
Es posible modificar los colores que reciben los eventos en <em>Formato > Data colors</em>.
El campo de la visualización <em>Event Group</em> nos permite agrupar los eventos según el criterio impuesto por el campo que llevemos aquí, mostrando en este caso todos los eventos del mismo grupo con el mismo color. Por ejemplo, si llevamos a este campo nuestro campo <em>Category</em> (con el rol de cada empleado), la visualización se muestra ahora con el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_10.jpg"></a>
Todos los eventos de la misma categoría se muestran con el mismo color, y la leyenda superior también refleja este hecho adecuadamente.
Es posible mostrar los meses anteriores o posteriores haciendo uso de los controles que se muestran en la esquina superior izquierda del calendario. En dicho caso, un clic en el botón "Today" nos devolverá al mes actual:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_06.jpg"></a>
A la misma altura que estos botones pero en el extremo derecho podemos modificar la vista para mostrar la información a nivel de semanas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_07.jpg"></a>
...aunque puede comprobarse que los textos con los nombres de los eventos no son sencillos de leer. Afortunadamente, al mover el cursor encima de una de las columnas se muestra en una ventanita emergente el nombre del evento completo. También tenemos la leyenda como ayuda, por supuesto, aunque en el caso de que haya muchos eventos (es decir, más de 4 o 5), se agradecería que la leyenda se filtrase para mostrar solo las etiquetas de la semana seleccionada.
También podemos entrar en modo "día":
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_08.jpg"></a>
También aquí se agradecería que las etiquetas que se muestran en la parte superior de cada columna se moviesen verticalmente cuando hacemos scroll, de forma que estuviesen siempre visibles.
Y, por último, tenemos la vista "lista" en la que vemos los eventos en este formato. En este caso siempre se muestran los eventos de un único mes (que podemos cambiar con los controles comentados de la esquina superior izquierda), no siendo posible modificar este nivel de detalle:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/calendar_by_maq_09.jpg"></a>
La visualización ofrece bastantes opciones de configuración: qué vistas queremos que estén a disposición del usuario y cuáles no, las horas y días laborables, mostrar o no el número de cada semana... Activemos esta última opción. Ahora, en todas las vistas se indica -en alguna parte- el número de la semana pero, en la vista mensual, un clic en el número de la semana que se muestra a la izquierda de cada bloque de 7 días nos lleva a la vista semanal (para dicha semana, obviamente). Y, aunque no se ha comentado todavía, haciendo clic en el número de un día en la vista mensual, o haciendo clic en la cabecera de un día en la vista semanal iremos a la vista del día correspondiente.
Muy buena visualización, con margen para mejora, por supuesto, pero muy recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: 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)