├── IE 3.0 Gantt Chart Plotly.png ├── README.md ├── diagrams (1).ipynb └── gantt_chart_new.csv /IE 3.0 Gantt Chart Plotly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxwellbade/plotly_gantt_chart/cba58efb5206377cec592ac121361f52b50e0120/IE 3.0 Gantt Chart Plotly.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # plotly_gantt_chart 2 | just a plotly gantt chart with a bunch of configs that weren't easy to find 3 | 4 | ![IE 3 0 Gantt Chart Plotly](https://user-images.githubusercontent.com/18491142/101520408-12296d00-394a-11eb-97c0-2e92919ea65b.png) 5 | 6 | -------------------------------------------------------------------------------- /diagrams (1).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import os\n", 10 | "os.environ[\"PATH\"] += os.pathsep + r'C:\\Program Files\\Graphviz\\bin'\n", 11 | "\n", 12 | "from diagrams import Cluster, Diagram, Edge\n", 13 | "from diagrams.onprem.analytics import Spark\n", 14 | "from diagrams.onprem.compute import Server\n", 15 | "from diagrams.onprem.database import PostgreSQL\n", 16 | "from diagrams.onprem.inmemory import Redis\n", 17 | "from diagrams.onprem.logging import Fluentd\n", 18 | "from diagrams.onprem.monitoring import Grafana, Prometheus\n", 19 | "from diagrams.onprem.network import Nginx\n", 20 | "from diagrams.onprem.queue import Kafka\n", 21 | "\n", 22 | "with Diagram(name=\"Advanced Web Service with On-Premise (colored)\", show=True):\n", 23 | " ingress = Nginx(\"ingress\")\n", 24 | "\n", 25 | " metrics = Prometheus(\"metric\")\n", 26 | " metrics << Edge(color=\"firebrick\", style=\"dashed\") << Grafana(\"monitoring\")\n", 27 | "\n", 28 | " with Cluster(\"Service Cluster\"):\n", 29 | " grpcsvc = [\n", 30 | " Server(\"grpc1\"),\n", 31 | " Server(\"grpc2\"),\n", 32 | " Server(\"grpc3\")]\n", 33 | "\n", 34 | " with Cluster(\"Sessions HA\"):\n", 35 | " master = Redis(\"session\")\n", 36 | " master - Edge(color=\"brown\", style=\"dashed\") - Redis(\"replica\") << Edge(label=\"collect\") << metrics\n", 37 | " grpcsvc >> Edge(color=\"brown\") >> master\n", 38 | "\n", 39 | " with Cluster(\"Database HA\"):\n", 40 | " master = PostgreSQL(\"users\")\n", 41 | " master - Edge(color=\"brown\", style=\"dotted\") - PostgreSQL(\"slave\") << Edge(label=\"collect\") << metrics\n", 42 | " grpcsvc >> Edge(color=\"black\") >> master\n", 43 | "\n", 44 | " aggregator = Fluentd(\"logging\")\n", 45 | " aggregator >> Edge(label=\"parse\") >> Kafka(\"stream\") >> Edge(color=\"black\", style=\"bold\") >> Spark(\"analytics\")\n", 46 | "\n", 47 | " ingress >> Edge(color=\"darkgreen\") << grpcsvc >> Edge(color=\"darkorange\") >> aggregator" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 10, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "from diagrams import Cluster, Diagram\n", 57 | "from diagrams.k8s.compute import Pod, StatefulSet\n", 58 | "from diagrams.k8s.network import Service\n", 59 | "from diagrams.k8s.storage import PV, PVC, StorageClass\n", 60 | "\n", 61 | "with Diagram(\"Stateful Architecture\", show=True):\n", 62 | " with Cluster(\"Apps\"):\n", 63 | " svc = Service(\"svc\")\n", 64 | " sts = StatefulSet(\"sts\")\n", 65 | "\n", 66 | " apps = []\n", 67 | " for _ in range(3):\n", 68 | " pod = Pod(\"pod\")\n", 69 | " pvc = PVC(\"pvc\")\n", 70 | " pod - sts - pvc\n", 71 | " apps.append(svc >> pod >> pvc)\n", 72 | "\n", 73 | " apps << PV(\"pv\") << StorageClass(\"sc\")" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 11, 79 | "metadata": {}, 80 | "outputs": [], 81 | "source": [ 82 | "from diagrams import Diagram\n", 83 | "from diagrams.k8s.clusterconfig import HPA\n", 84 | "from diagrams.k8s.compute import Deployment, Pod, ReplicaSet\n", 85 | "from diagrams.k8s.network import Ingress, Service\n", 86 | "\n", 87 | "with Diagram(\"Exposed Pod with 3 Replicas\", show=True):\n", 88 | " net = Ingress(\"domain.com\") >> Service(\"svc\")\n", 89 | " net >> [Pod(\"pod1\"),\n", 90 | " Pod(\"pod2\"),\n", 91 | " Pod(\"pod3\")] << ReplicaSet(\"rs\") << Deployment(\"dp\") << HPA(\"hpa\")" 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "execution_count": 13, 97 | "metadata": {}, 98 | "outputs": [], 99 | "source": [ 100 | "from diagrams import Cluster, Diagram\n", 101 | "from diagrams.gcp.analytics import BigQuery, Dataflow, PubSub\n", 102 | "from diagrams.gcp.compute import AppEngine, Functions\n", 103 | "from diagrams.gcp.database import BigTable\n", 104 | "from diagrams.gcp.iot import IotCore\n", 105 | "from diagrams.gcp.storage import GCS\n", 106 | "\n", 107 | "with Diagram(\"Message Collecting\", show=True):\n", 108 | " pubsub = PubSub(\"pubsub\")\n", 109 | "\n", 110 | " with Cluster(\"Source of Data\"):\n", 111 | " [IotCore(\"core1\"),\n", 112 | " IotCore(\"core2\"),\n", 113 | " IotCore(\"core3\")] >> pubsub\n", 114 | "\n", 115 | " with Cluster(\"Targets\"):\n", 116 | " with Cluster(\"Data Flow\"):\n", 117 | " flow = Dataflow(\"data flow\")\n", 118 | "\n", 119 | " with Cluster(\"Data Lake\"):\n", 120 | " flow >> [BigQuery(\"bq\"),\n", 121 | " GCS(\"storage\")]\n", 122 | "\n", 123 | " with Cluster(\"Event Driven\"):\n", 124 | " with Cluster(\"Processing\"):\n", 125 | " flow >> AppEngine(\"engine\") >> BigTable(\"bigtable\")\n", 126 | "\n", 127 | " with Cluster(\"Serverless\"):\n", 128 | " flow >> Functions(\"func\") >> AppEngine(\"appengine\")\n", 129 | "\n", 130 | " pubsub >> flow" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 14, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [ 139 | "from diagrams import Cluster, Diagram\n", 140 | "from diagrams.aws.compute import ECS, EKS, Lambda\n", 141 | "from diagrams.aws.database import Redshift\n", 142 | "from diagrams.aws.integration import SQS\n", 143 | "from diagrams.aws.storage import S3\n", 144 | "\n", 145 | "with Diagram(\"Event Processing\", show=True):\n", 146 | " source = EKS(\"k8s source\")\n", 147 | "\n", 148 | " with Cluster(\"Event Flows\"):\n", 149 | " with Cluster(\"Event Workers\"):\n", 150 | " workers = [ECS(\"worker1\"),\n", 151 | " ECS(\"worker2\"),\n", 152 | " ECS(\"worker3\")]\n", 153 | "\n", 154 | " queue = SQS(\"event queue\")\n", 155 | "\n", 156 | " with Cluster(\"Processing\"):\n", 157 | " handlers = [Lambda(\"proc1\"),\n", 158 | " Lambda(\"proc2\"),\n", 159 | " Lambda(\"proc3\")]\n", 160 | "\n", 161 | " store = S3(\"events store\")\n", 162 | " dw = Redshift(\"analytics\")\n", 163 | "\n", 164 | " source >> workers >> queue >> handlers\n", 165 | " handlers >> store\n", 166 | " handlers >> dw" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 44, 172 | "metadata": {}, 173 | "outputs": [ 174 | { 175 | "data": { 176 | "text/plain": [ 177 | "['Results of Task',\n", 178 | " 'Establish and agree upon Agile standards/framework',\n", 179 | " 'Communicate Agile structure to business groups',\n", 180 | " 'Select proper tooling',\n", 181 | " 'Results of Task',\n", 182 | " 'Refine analytic data use operating model',\n", 183 | " 'Define analytic persona\\x92s and use cases',\n", 184 | " 'Define operational data use operating model',\n", 185 | " 'Define operational persona\\x92s and use cases ',\n", 186 | " 'Define standard ',\n", 187 | " 'Results of Task',\n", 188 | " 'ID appropriate use case requirements for applying methodology (i.e. what are expectations from the business, what are deliverable expectations etc.)',\n", 189 | " 'Create template for data use stories (i.e. data sets, data presentation, data analysis, Data validation, advanced analytic stories)',\n", 190 | " 'Results of Task',\n", 191 | " 'Identify product advisory council attendees',\n", 192 | " 'Create governance model/methodology',\n", 193 | " 'Results of Task',\n", 194 | " 'ID all candidate roles and process to keep bench as opposed to OJT',\n", 195 | " 'ID incentive and disincentive components to manage contract',\n", 196 | " 'ID candidate partners for various work components',\n", 197 | " 'Create methodology to manage bid process and selection \\x96 partner with procurement',\n", 198 | " 'Results of task',\n", 199 | " 'Define scope of project',\n", 200 | " 'Results of task',\n", 201 | " 'ID tools for self-service ties to tools/tech',\n", 202 | " 'Determine extent of centrally managed policy engines',\n", 203 | " 'What multi-tenancy restrictions should be established',\n", 204 | " 'Access control \\x96 Tie to IT IAM strategy',\n", 205 | " 'Evaluate security, PHI, access restrictions',\n", 206 | " 'Results of task',\n", 207 | " 'Publish product and service catalog outlining initial build/implementation of the product or service as well as the ongoing costs',\n", 208 | " 'Results of task',\n", 209 | " 'ID standard tools for self-service',\n", 210 | " 'Create governance and methodology use cases',\n", 211 | " 'Create training protocol for tool consumption',\n", 212 | " 'Database/System design for persistent data to be stored on remote, network attached storage',\n", 213 | " 'Identify systems requirements',\n", 214 | " 'Technology/vendor selection',\n", 215 | " 'Migration effort to be considered; layout strategy',\n", 216 | " 'Downstream efforts - existing processes to migrate; how to enable a seamless transition; which approach to use - coexist or turn off/turn on',\n", 217 | " 'Enable S3 as primary storage, move away from other storage solutions and determine config',\n", 218 | " 'Establish rules/processes to ensure S3 is the primary storage solution',\n", 219 | " 'Recompilation and redeployment of jobs is required',\n", 220 | " 'Stand up non-prod two node cluster job/script execution',\n", 221 | " 'Decommission version 5 by May 21 2021',\n", 222 | " 'Results of task',\n", 223 | " 'Identify self-service needs/requirements for each group ',\n", 224 | " 'Identify the right tool for the right purpose',\n", 225 | " 'Learning and creating guidelines on how to use new tools',\n", 226 | " 'Estimate adoption rate',\n", 227 | " 'Gauge time to ramp-up',\n", 228 | " 'Evaluate if migration from existing tools to new tools is required',\n", 229 | " 'Results of task',\n", 230 | " 'Identify compatible tooling',\n", 231 | " 'Determine requirements specific for each business group',\n", 232 | " 'Identify VDI-based security issues for additional R/Python libraries',\n", 233 | " 'Document and communicate procedure to add new ML features/libraries to remote environments',\n", 234 | " 'Estimate value of paid tools vs free libraries',\n", 235 | " 'Determine if automated ML tools are necessary (Datarobot vs Azure ML)',\n", 236 | " 'Gauge level of adoption',\n", 237 | " 'Document FAQs and consider questions specific to each business group',\n", 238 | " 'Results of task',\n", 239 | " 'Determine scope \\x96 DR, HA, Extent of insight and notification needs',\n", 240 | " 'Establish continuous monitoring needs aligned with DevOps',\n", 241 | " 'Resiliency testing approach',\n", 242 | " 'Monitoring tools',\n", 243 | " 'Incident response communication protocol (ties to governance and operating model)',\n", 244 | " 'Identify compatible tooling/technology',\n", 245 | " 'Consider location/region-based connection practices',\n", 246 | " 'Consider multiple physical data center connection locations for resiliency to connectivity failures due to fiber cut, device failure or complete location failure',\n", 247 | " 'Determine if dynamically routed and active connections vs. statically routed for load balancing and failover',\n", 248 | " 'Results of task',\n", 249 | " 'Identify compatible tooling',\n", 250 | " 'Determine instance requirements specific for each business group',\n", 251 | " 'Launch instances and document keys/passwords',\n", 252 | " 'Communicate instance configurations and setup notes to each group',\n", 253 | " 'Estimate level of adoption',\n", 254 | " 'Predict and document FAQs',\n", 255 | " 'Document how to use Microsoft Remote Desktop Apps for Mac users',\n", 256 | " 'Install supporting software (R, Python, Firefox etc.)',\n", 257 | " 'Identify an owner/manager of compute elasticity/infrastructure operations',\n", 258 | " 'Identify rules of engagement and governance for when the process is live',\n", 259 | " 'Results of task',\n", 260 | " 'Prioritize data pipelines (tie to Data COE)',\n", 261 | " 'Pilot analytics in data pipeline (tie to NextBlue AA COE)',\n", 262 | " 'Define event streaming hub approach (i.e. people process tech)',\n", 263 | " 'Determine appropriate/compatible event streaming tools (Apache Kafka, Hazelcast Jet etc.)',\n", 264 | " 'Determine streaming rate requirements specific to each business group',\n", 265 | " 'Map out the data flow/data architecture and associated patterns',\n", 266 | " 'Identify who will do the publishing framework',\n", 267 | " 'Deploy and document',\n", 268 | " 'There are dependencies on infrastructure prior to putting this in place',\n", 269 | " 'Results of task',\n", 270 | " 'Define tools/tech and associated dependencies',\n", 271 | " 'Align with cloud COE',\n", 272 | " 'Establish development guidelines',\n", 273 | " 'Pilot?',\n", 274 | " 'Tie to governance and operating model \\x96 when to use how to use etc.',\n", 275 | " 'Determine which tasks will be microservices',\n", 276 | " 'Determine tools to run/containerize microservices',\n", 277 | " 'Select a microservice deployment strategy (Service Instance per Host, Multiple Service Instances per Host, Service Instance per Virtual Machine etc.)',\n", 278 | " 'Determine if you need a cluster manager (Kubernetes, Marathon etc.)',\n", 279 | " 'Identify enablement approach',\n", 280 | " 'Results of task',\n", 281 | " 'Define tools/tech and associated dependencies',\n", 282 | " 'Align with cloud COE',\n", 283 | " 'Establish development guidelines',\n", 284 | " 'Pilot?',\n", 285 | " 'Tie to governance and operating model \\x96 when to use how to use etc.',\n", 286 | " 'Determine whether to containerize existing legacy application without refactoring into microservices',\n", 287 | " 'Identify barriers between security and devops',\n", 288 | " 'Determine drawbacks: such as container infrastructure is not as mature or secure as the infrastructure for VMs (containers share the kernel of the host OS with one another)',\n", 289 | " 'Results of task',\n", 290 | " 'Identify a back-end physical infrastructure to enable digital tools',\n", 291 | " 'Evaluate a hybrid cloud strategy (with an eye for the worker UX)',\n", 292 | " 'Evaluate existing support services for the workplace',\n", 293 | " 'Implement technology for a real-time, 360 view of the UX',\n", 294 | " 'Results of task',\n", 295 | " 'Orchestration and management of services, applications and data flow',\n", 296 | " 'Automation of business processes',\n", 297 | " 'Establishment of federated security and Single Sign-On',\n", 298 | " 'System logging and monitoring',\n", 299 | " 'Data analysis, reporting and predictions',\n", 300 | " 'Monitoring of mobile and IoT devices',\n", 301 | " 'Implementation of Big Data solutions',\n", 302 | " 'Centralized (mobile ready) web solutions for clients and employees',\n", 303 | " 'Scalability and high-load support',\n", 304 | " 'SaaS and multi-tenancy support',\n", 305 | " 'Centralized control of infrastructure management etc.',\n", 306 | " 'Results of task',\n", 307 | " 'Determine compatible tools',\n", 308 | " 'Identify downfalls of low code platforms',\n", 309 | " 'Estimate adoption rate',\n", 310 | " 'Results of task',\n", 311 | " 'Determine the FHIR server architecture',\n", 312 | " 'Determine compatibility of servers and FHIR versions to ensure interoperability',\n", 313 | " 'Understand the APIs as well as the level of completion per API',\n", 314 | " 'Identify where to put/install the FHIR server',\n", 315 | " 'Estimate adoption rate',\n", 316 | " 'Results of task',\n", 317 | " 'ID priority governance model evaluation needs \\x96 self-service, machine learning model productionalization, operational area use and interaction']" 318 | ] 319 | }, 320 | "execution_count": 44, 321 | "metadata": {}, 322 | "output_type": "execute_result" 323 | } 324 | ], 325 | "source": [ 326 | "list(df['Task'])" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 200, 332 | "metadata": {}, 333 | "outputs": [ 334 | { 335 | "data": { 336 | "application/vnd.jupyter.widget-view+json": { 337 | "model_id": "edadd8092eaf42da84e6665159ac4d63", 338 | "version_major": 2, 339 | "version_minor": 0 340 | }, 341 | "text/plain": [ 342 | "FigureWidget({\n", 343 | " 'data': [{'alignmentgroup': 'True',\n", 344 | " 'base': array([datetime.datetime(2021, 3,…" 345 | ] 346 | }, 347 | "metadata": {}, 348 | "output_type": "display_data" 349 | } 350 | ], 351 | "source": [ 352 | "import pandas as pd\n", 353 | "import plotly.express as px\n", 354 | "import plotly.figure_factory as ff\n", 355 | "import plotly.graph_objs as go\n", 356 | "import chart_studio\n", 357 | "import chart_studio.plotly as py \n", 358 | "import chart_studio.tools as tls\n", 359 | "\n", 360 | "df = pd.read_csv('gantt_chart_new.csv',encoding='latin1')\n", 361 | "df['Start'] = df['Start'].astype('datetime64')\n", 362 | "df['Finish'] = df['Finish'].astype('datetime64')\n", 363 | "# print(df.dtypes)\n", 364 | "# print(df.head())\n", 365 | "\n", 366 | "colors = {'Technology' : 'rgb(30,144,255)'\n", 367 | " , 'Technology - Date TBD' : 'rgb(211,211,211)'\n", 368 | " , 'People' : 'rgb(95,158,160)'\n", 369 | " , 'Process' : 'rgb(0,0,128)'\n", 370 | " , 'Process - Date TBD' : 'rgb(211,211,210)'}\n", 371 | " \n", 372 | "orders = list(df['Task'])\n", 373 | "\n", 374 | "fig = px.timeline(df\n", 375 | " , x_start=\"Start\"\n", 376 | " , x_end=\"Finish\"\n", 377 | " , y=\"Resource\"\n", 378 | " , hover_name=\"Task\"\n", 379 | "# , facet_col=\"Dimension\"\n", 380 | "# , facet_col_wrap=40\n", 381 | "# , facet_col_spacing=.99\n", 382 | "# , color_discrete_sequence=['green']*len(df)\n", 383 | " , color_discrete_sequence=px.colors.qualitative.Prism\n", 384 | " , category_orders={'Task':['Results of Task','Establish and agree upon Agile standards/framework','Communicate Agile structure to business groups','Select proper tooling','Results of Task','Refine analytic data use operating model','Define analytic persona\\x92s and use cases','Define operational data use operating model','Define operational persona\\x92s and use cases ','Define standard ','Results of Task','ID appropriate use case requirements for applying methodology (i.e. what are expectations from the business, what are deliverable expectations etc.)',\n", 385 | " 'Create template for data use stories (i.e. data sets, data presentation, data analysis, Data validation, advanced analytic stories)','Results of Task','Identify product advisory council attendees','Create governance model/methodology','Results of Task','ID all candidate roles and process to keep bench as opposed to OJT','ID incentive and disincentive components to manage contract','ID candidate partners for various work components','Create methodology to manage bid process and selection \\x96 partner with procurement','Results of task','Define scope of project','Results of task','ID tools for self-service ties to tools/tech','Determine extent of centrally managed policy engines','What multi-tenancy restrictions should be established','Access control \\x96 Tie to IT IAM strategy','Evaluate security, PHI, access restrictions','Results of task','Publish product and service catalog outlining initial build/implementation of the product or service as well as the ongoing costs','Results of task','ID standard tools for self-service','Create governance and methodology use cases','Create training protocol for tool consumption',\n", 386 | " 'Database/System design for persistent data to be stored on remote, network attached storage','Identify systems requirements','Technology/vendor selection','Migration effort to be considered; layout strategy','Downstream efforts - existing processes to migrate; how to enable a seamless transition; which approach to use - coexist or turn off/turn on','Enable S3 as primary storage, move away from other storage solutions and determine config','Establish rules/processes to ensure S3 is the primary storage solution','Recompilation and redeployment of jobs is required','Stand up non-prod two node cluster job/script execution','Decommission version 5 by May 21 2021','Results of task','Identify self-service needs/requirements for each group ','Identify the right tool for the right purpose','Learning and creating guidelines on how to use new tools','Estimate adoption rate','Gauge time to ramp-up','Evaluate if migration from existing tools to new tools is required',\n", 387 | " 'Results of task','Identify compatible tooling','Determine requirements specific for each business group','Identify VDI-based security issues for additional R/Python libraries','Document and communicate procedure to add new ML features/libraries to remote environments','Estimate value of paid tools vs free libraries','Determine if automated ML tools are necessary (Datarobot vs Azure ML)','Gauge level of adoption','Document FAQs and consider questions specific to each business group','Results of task','Determine scope \\x96 DR, HA, Extent of insight and notification needs','Establish continuous monitoring needs aligned with DevOps','Resiliency testing approach','Monitoring tools','Incident response communication protocol (ties to governance and operating model)','Identify compatible tooling/technology','Consider location/region-based connection practices',\n", 388 | " 'Consider multiple physical data center connection locations for resiliency to connectivity failures due to fiber cut, device failure or complete location failure','Determine if dynamically routed and active connections vs. statically routed for load balancing and failover','Results of task','Identify compatible tooling','Determine instance requirements specific for each business group','Launch instances and document keys/passwords','Communicate instance configurations and setup notes to each group','Estimate level of adoption','Predict and document FAQs','Document how to use Microsoft Remote Desktop Apps for Mac users','Install supporting software (R, Python, Firefox etc.)','Identify an owner/manager of compute elasticity/infrastructure operations',\n", 389 | " 'Identify rules of engagement and governance for when the process is live','Results of task','Prioritize data pipelines (tie to Data COE)','Pilot analytics in data pipeline (tie to NextBlue AA COE)','Define event streaming hub approach (i.e. people process tech)','Determine appropriate/compatible event streaming tools (Apache Kafka, Hazelcast Jet etc.)','Determine streaming rate requirements specific to each business group','Map out the data flow/data architecture and associated patterns','Identify who will do the publishing framework','Deploy and document','There are dependencies on infrastructure prior to putting this in place','Results of task','Define tools/tech and associated dependencies','Align with cloud COE','Establish development guidelines','Pilot?','Tie to governance and operating model \\x96 when to use how to use etc.','Determine which tasks will be microservices','Determine tools to run/containerize microservices',\n", 390 | " 'Select a microservice deployment strategy (Service Instance per Host, Multiple Service Instances per Host, Service Instance per Virtual Machine etc.)','Determine if you need a cluster manager (Kubernetes, Marathon etc.)','Identify enablement approach','Results of task','Define tools/tech and associated dependencies','Align with cloud COE','Establish development guidelines','Pilot?','Tie to governance and operating model \\x96 when to use how to use etc.','Determine whether to containerize existing legacy application without refactoring into microservices','Identify barriers between security and devops','Determine drawbacks: such as container infrastructure is not as mature or secure as the infrastructure for VMs (containers share the kernel of the host OS with one another)','Results of task','Identify a back-end physical infrastructure to enable digital tools','Evaluate a hybrid cloud strategy (with an eye for the worker UX)',\n", 391 | " 'Evaluate existing support services for the workplace','Implement technology for a real-time, 360 view of the UX','Results of task','Orchestration and management of services, applications and data flow','Automation of business processes','Establishment of federated security and Single Sign-On','System logging and monitoring','Data analysis, reporting and predictions','Monitoring of mobile and IoT devices','Implementation of Big Data solutions','Centralized (mobile ready) web solutions for clients and employees','Scalability and high-load support','SaaS and multi-tenancy support','Centralized control of infrastructure management etc.','Results of task','Determine compatible tools','Identify downfalls of low code platforms','Estimate adoption rate',\n", 392 | " 'Results of task','Determine the FHIR server architecture','Determine compatibility of servers and FHIR versions to ensure interoperability','Understand the APIs as well as the level of completion per API','Identify where to put/install the FHIR server','Estimate adoption rate','Results of task','ID priority governance model evaluation needs \\x96 self-service, machine learning model productionalization, operational area use and interaction']}\n", 393 | " , opacity=.7\n", 394 | "# , text=\"Task\"\n", 395 | " , range_x=None\n", 396 | " , range_y=None\n", 397 | " , template='plotly_white'\n", 398 | " , height=800\n", 399 | " , width=1500\n", 400 | " , color='Dimension'\n", 401 | " , title =\"IE 3.0 Gantt Chart 2021\"\n", 402 | "# , color=colors\n", 403 | " )\n", 404 | "\n", 405 | "fig.update_layout(\n", 406 | " bargap=0.5\n", 407 | " ,bargroupgap=0.1\n", 408 | " ,xaxis_range=[df.Start.min(), df.Finish.max()]\n", 409 | " ,xaxis = dict(\n", 410 | " showgrid=True\n", 411 | " ,rangeslider_visible=True\n", 412 | " ,side =\"top\"\n", 413 | " ,tickmode = 'array'\n", 414 | " ,dtick=\"M1\"\n", 415 | " ,tickformat=\"Q%q %Y \\n\"\n", 416 | " ,ticklabelmode=\"period\" \n", 417 | " ,ticks=\"outside\"\n", 418 | " ,tickson=\"boundaries\"\n", 419 | " ,tickwidth=.1\n", 420 | " ,layer='below traces'\n", 421 | " ,ticklen=20\n", 422 | " ,tickfont=dict(\n", 423 | " family='Old Standard TT, serif',size=24,color='gray')\n", 424 | " ,rangeselector=dict(\n", 425 | " buttons=list([\n", 426 | " dict(count=1, label=\"1m\", step=\"month\", stepmode=\"backward\"),\n", 427 | " dict(count=6, label=\"6m\", step=\"month\", stepmode=\"backward\"),\n", 428 | " dict(count=1, label=\"YTD\", step=\"year\", stepmode=\"todate\"),\n", 429 | " dict(count=1, label=\"1y\", step=\"year\", stepmode=\"backward\"),\n", 430 | " dict(step=\"all\")\n", 431 | " ])\n", 432 | " ,x=.37\n", 433 | " ,y=-.05\n", 434 | " ,font=dict(\n", 435 | " family=\"Arial\",\n", 436 | " size=14,\n", 437 | " color=\"darkgray\"\n", 438 | " )))\n", 439 | " \n", 440 | " ,yaxis = dict(\n", 441 | " title= \"\"\n", 442 | " ,autorange=\"reversed\"\n", 443 | " ,automargin=True\n", 444 | "# ,anchor=\"free\"\n", 445 | " ,ticklen=10\n", 446 | " ,showgrid=True\n", 447 | " ,showticklabels=True\n", 448 | " ,tickfont=dict(\n", 449 | " family='Old Standard TT, serif', size=16, color='gray'))\n", 450 | " \n", 451 | " ,legend=dict(\n", 452 | " orientation=\"h\"\n", 453 | " ,yanchor=\"bottom\"\n", 454 | " ,y=1.1\n", 455 | " ,title=\"\"\n", 456 | " ,xanchor=\"right\"\n", 457 | " ,x=1\n", 458 | " ,font=dict(\n", 459 | " family=\"Arial\"\n", 460 | " ,size=14\n", 461 | " ,color=\"darkgray\"))\n", 462 | ")\n", 463 | "\n", 464 | "fig.update_traces( #marker_color='rgb(158,202,225)'\n", 465 | " marker_line_color='rgb(8,48,107)'\n", 466 | " , marker_line_width=1.5, opacity=0.95)\n", 467 | "\n", 468 | "fig.update_layout(\n", 469 | " title=\"IE 3.0 Gantt Chart 2021\",\n", 470 | " xaxis_title=\"\",\n", 471 | "# margin_l=400,\n", 472 | " yaxis_title=\"Initiatives\",\n", 473 | "# legend_title=\"Dimension: \",\n", 474 | " font=dict(\n", 475 | " family=\"Arial\",\n", 476 | " size=24,\n", 477 | " color=\"darkgray\"\n", 478 | " )\n", 479 | ")\n", 480 | "\n", 481 | "# fig.show()\n", 482 | "fig.write_html(\"C:/Users/maxwell.bade/Downloads/ie_3_gantt.html\")\n", 483 | "go.FigureWidget(fig)" 484 | ] 485 | }, 486 | { 487 | "cell_type": "code", 488 | "execution_count": 202, 489 | "metadata": {}, 490 | "outputs": [ 491 | { 492 | "data": { 493 | "text/plain": [ 494 | "'https://plotly.com/~maxbade/1/'" 495 | ] 496 | }, 497 | "execution_count": 202, 498 | "metadata": {}, 499 | "output_type": "execute_result" 500 | } 501 | ], 502 | "source": [ 503 | "username = 'maxbade'\n", 504 | "api_key = 'ZLoHQuLuAbT6BlsApZYK'\n", 505 | "\n", 506 | "chart_studio.tools.set_credentials_file(username=username, api_key=api_key)\n", 507 | "py.plot(fig, filename = 'IE 3.0 Gantt Chart Plotly', auto_open=False)" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 19, 513 | "metadata": { 514 | "scrolled": false 515 | }, 516 | "outputs": [ 517 | { 518 | "data": { 519 | "application/vnd.plotly.v1+json": { 520 | "config": { 521 | "plotlyServerURL": "https://plot.ly" 522 | }, 523 | "data": [ 524 | { 525 | "alignmentgroup": "True", 526 | "base": [ 527 | "2021-01-01T00:00:00", 528 | "2021-01-01T00:00:00", 529 | "2021-02-02T00:00:00", 530 | "2021-01-01T00:00:00" 531 | ], 532 | "hovertemplate": "Dimension=People
Start=%{base}
Finish=%{x}
Task=%{y}", 533 | "legendgroup": "People", 534 | "marker": { 535 | "color": "rgb(95, 70, 144)", 536 | "opacity": 0.5 537 | }, 538 | "name": "People", 539 | "offsetgroup": "People", 540 | "orientation": "h", 541 | "showlegend": true, 542 | "textposition": "auto", 543 | "type": "bar", 544 | "x": [ 545 | 7689600000, 546 | 2678400000, 547 | 1123200000, 548 | 7689600000 549 | ], 550 | "xaxis": "x", 551 | "y": [ 552 | "Agile DevOps Culture", 553 | "Task one test", 554 | "Task two test", 555 | "Organizational Design and Operating Model" 556 | ], 557 | "yaxis": "y" 558 | }, 559 | { 560 | "alignmentgroup": "True", 561 | "base": [ 562 | "2021-01-01T00:00:00", 563 | "2021-01-01T00:00:00", 564 | "2021-01-01T00:00:00", 565 | "2021-04-01T00:00:00", 566 | "2021-07-01T00:00:00", 567 | "2021-10-01T00:00:00" 568 | ], 569 | "hovertemplate": "Dimension=Process
Start=%{base}
Finish=%{x}
Task=%{y}", 570 | "legendgroup": "Process", 571 | "marker": { 572 | "color": "rgb(29, 105, 150)", 573 | "opacity": 0.5 574 | }, 575 | "name": "Process", 576 | "offsetgroup": "Process", 577 | "orientation": "h", 578 | "showlegend": true, 579 | "textposition": "auto", 580 | "type": "bar", 581 | "x": [ 582 | 7689600000, 583 | 7689600000, 584 | 7689600000, 585 | 7776000000, 586 | 7862400000, 587 | 7862400000 588 | ], 589 | "xaxis": "x", 590 | "y": [ 591 | "Delivery Methodology-Agile, RAD, DevOps, Left Testing, TDD, Low-Code", 592 | "Product Mgmt Evolution-Product Advisory Council", 593 | "Expansion of Managed Service Arrangements", 594 | "DevOps, DataOps, MLOps", 595 | "Expansion of Self-Service Models", 596 | "Financial Transparency Process Dev" 597 | ], 598 | "yaxis": "y" 599 | }, 600 | { 601 | "alignmentgroup": "True", 602 | "base": [ 603 | "2021-01-01T00:00:00", 604 | "2021-04-01T00:00:00", 605 | "2021-07-01T00:00:00", 606 | "2021-07-01T00:00:00", 607 | "2021-10-01T00:00:00", 608 | "2021-10-01T00:00:00", 609 | "2021-10-01T00:00:00" 610 | ], 611 | "hovertemplate": "Dimension=Technology
Start=%{base}
Finish=%{x}
Task=%{y}", 612 | "legendgroup": "Technology", 613 | "marker": { 614 | "color": "rgb(56, 166, 165)", 615 | "opacity": 0.5 616 | }, 617 | "name": "Technology", 618 | "offsetgroup": "Technology", 619 | "orientation": "h", 620 | "showlegend": true, 621 | "textposition": "auto", 622 | "type": "bar", 623 | "x": [ 624 | 31449600000, 625 | 23673600000, 626 | 7862400000, 627 | 7862400000, 628 | 7862400000, 629 | 7862400000, 630 | 7862400000 631 | ], 632 | "xaxis": "x", 633 | "y": [ 634 | "Decouple compute/storage", 635 | "Self-Service Tools", 636 | "AI/ML Infrastructure/tools", 637 | "Resilient/Durable", 638 | "Elastic Infrastructure/Dynamic Compute", 639 | "Event Streaming", 640 | "Microservices" 641 | ], 642 | "yaxis": "y" 643 | }, 644 | { 645 | "alignmentgroup": "True", 646 | "base": [ 647 | "2021-01-01T00:00:00", 648 | "2021-01-01T00:00:00", 649 | "2021-01-01T00:00:00", 650 | "2021-01-01T00:00:00", 651 | "2021-01-01T00:00:00" 652 | ], 653 | "hovertemplate": "Dimension=Technology - Date TBD
Start=%{base}
Finish=%{x}
Task=%{y}", 654 | "legendgroup": "Technology - Date TBD", 655 | "marker": { 656 | "color": "rgb(15, 133, 84)", 657 | "opacity": 0.5 658 | }, 659 | "name": "Technology - Date TBD", 660 | "offsetgroup": "Technology - Date TBD", 661 | "orientation": "h", 662 | "showlegend": true, 663 | "textposition": "auto", 664 | "type": "bar", 665 | "x": [ 666 | 31449600000, 667 | 31449600000, 668 | 31449600000, 669 | 31449600000, 670 | 31449600000 671 | ], 672 | "xaxis": "x", 673 | "y": [ 674 | "Containerization ", 675 | "Hybrid Cloud Governance, Security and UX, Data Arch, Data Quality Mgmt", 676 | "Enterprise Orchestration", 677 | "Low-Code Dev Tools", 678 | "FHIR Data Architecture" 679 | ], 680 | "yaxis": "y" 681 | }, 682 | { 683 | "alignmentgroup": "True", 684 | "base": [ 685 | "2021-01-01T00:00:00" 686 | ], 687 | "hovertemplate": "Dimension=Process - Date TBD
Start=%{base}
Finish=%{x}
Task=%{y}", 688 | "legendgroup": "Process - Date TBD", 689 | "marker": { 690 | "color": "rgb(115, 175, 72)", 691 | "opacity": 0.5 692 | }, 693 | "name": "Process - Date TBD", 694 | "offsetgroup": "Process - Date TBD", 695 | "orientation": "h", 696 | "showlegend": true, 697 | "textposition": "auto", 698 | "type": "bar", 699 | "x": [ 700 | 31449600000 701 | ], 702 | "xaxis": "x", 703 | "y": [ 704 | "Governance Model Dev-Self-Service, Productionization, Lineage" 705 | ], 706 | "yaxis": "y" 707 | } 708 | ], 709 | "layout": { 710 | "annotations": [ 711 | { 712 | "font": { 713 | "color": "black", 714 | "size": 10 715 | }, 716 | "showarrow": false, 717 | "text": "Adopt an Agile/DevOps Cultre", 718 | "x": "2021-02-25", 719 | "y": 20 720 | }, 721 | { 722 | "font": { 723 | "color": "black", 724 | "size": 10 725 | }, 726 | "showarrow": false, 727 | "text": "More Aligned to business needs", 728 | "x": "2021-02-25", 729 | "y": 19 730 | }, 731 | { 732 | "font": { 733 | "color": "black", 734 | "size": 10 735 | }, 736 | "showarrow": false, 737 | "text": "Visibility of capacity/tasks/outcomes", 738 | "x": "2021-02-22", 739 | "y": 18 740 | }, 741 | { 742 | "font": { 743 | "color": "black", 744 | "size": 10 745 | }, 746 | "showarrow": false, 747 | "text": "Better IE collaboration", 748 | "x": "2021-03-08", 749 | "y": 17 750 | }, 751 | { 752 | "font": { 753 | "color": "black", 754 | "size": 10 755 | }, 756 | "showarrow": false, 757 | "text": "Elastic cpacity to serve more customers", 758 | "x": "2021-02-19", 759 | "y": 16 760 | }, 761 | { 762 | "font": { 763 | "color": "black", 764 | "size": 10 765 | }, 766 | "showarrow": false, 767 | "text": "Automation and greater efficiency", 768 | "x": "2021-05-25", 769 | "y": 15 770 | }, 771 | { 772 | "font": { 773 | "color": "black", 774 | "size": 10 775 | }, 776 | "showarrow": false, 777 | "text": "Greater flexibility and autonomy", 778 | "x": "2021-08-28", 779 | "y": 14 780 | }, 781 | { 782 | "font": { 783 | "color": "black", 784 | "size": 10 785 | }, 786 | "showarrow": false, 787 | "text": "Address Cost Transparency", 788 | "x": "2021-12-02", 789 | "y": 13 790 | }, 791 | { 792 | "font": { 793 | "color": "black", 794 | "size": 10 795 | }, 796 | "showarrow": false, 797 | "text": "Greater flexibility, elasticity and tracking", 798 | "x": "2021-11-18", 799 | "y": 12 800 | }, 801 | { 802 | "font": { 803 | "color": "black", 804 | "size": 10 805 | }, 806 | "showarrow": false, 807 | "text": "Greater access and usage to IE", 808 | "x": "2021-11-28", 809 | "y": 11 810 | }, 811 | { 812 | "font": { 813 | "color": "black", 814 | "size": 10 815 | }, 816 | "showarrow": false, 817 | "text": "Streamlined model dev and operations", 818 | "x": "2021-08-22", 819 | "y": 10 820 | }, 821 | { 822 | "font": { 823 | "color": "black", 824 | "size": 10 825 | }, 826 | "showarrow": false, 827 | "text": "Avoid application failures and downtime", 828 | "x": "2021-08-20", 829 | "y": 9 830 | }, 831 | { 832 | "font": { 833 | "color": "black", 834 | "size": 10 835 | }, 836 | "showarrow": false, 837 | "text": "Elastic and flexible for complex workloads", 838 | "x": "2021-11-19", 839 | "y": 8 840 | }, 841 | { 842 | "font": { 843 | "color": "black", 844 | "size": 10 845 | }, 846 | "showarrow": false, 847 | "text": "Consistent, real-time, data ingestion", 848 | "x": "2021-11-22", 849 | "y": 7 850 | }, 851 | { 852 | "font": { 853 | "color": "black", 854 | "size": 10 855 | }, 856 | "showarrow": false, 857 | "text": "Enable distributed data integration", 858 | "x": "2021-11-25", 859 | "y": 6 860 | }, 861 | { 862 | "font": { 863 | "color": "black", 864 | "size": 10 865 | }, 866 | "showarrow": false, 867 | "text": "Consumption-based cost, portability, consisten environments", 868 | "x": "2021-10-30", 869 | "y": 5 870 | }, 871 | { 872 | "font": { 873 | "color": "black", 874 | "size": 10 875 | }, 876 | "showarrow": false, 877 | "text": "Align cloud and networking strategies and simplify access controls implementation", 878 | "x": "2021-10-09", 879 | "y": 4 880 | }, 881 | { 882 | "font": { 883 | "color": "black", 884 | "size": 10 885 | }, 886 | "showarrow": false, 887 | "text": "Resolved data latency and interoperability", 888 | "x": "2021-11-18", 889 | "y": 3 890 | }, 891 | { 892 | "font": { 893 | "color": "black", 894 | "size": 10 895 | }, 896 | "showarrow": false, 897 | "text": "Business-friendly tools and requires a less technical skillset", 898 | "x": "2021-11-01", 899 | "y": 2 900 | }, 901 | { 902 | "font": { 903 | "color": "black", 904 | "size": 10 905 | }, 906 | "showarrow": false, 907 | "text": "Support bot clinical and non-clinical data", 908 | "x": "2021-11-19", 909 | "y": 1 910 | }, 911 | { 912 | "font": { 913 | "color": "black", 914 | "size": 10 915 | }, 916 | "showarrow": false, 917 | "text": "Greater ability for self-service and enhanced data lineage", 918 | "x": "2021-11-01", 919 | "y": 0 920 | } 921 | ], 922 | "barmode": "overlay", 923 | "height": 1000, 924 | "legend": { 925 | "orientation": "h", 926 | "title": { 927 | "text": "" 928 | }, 929 | "tracegroupgap": 0, 930 | "x": 1, 931 | "xanchor": "right", 932 | "y": 1.1, 933 | "yanchor": "bottom" 934 | }, 935 | "margin": { 936 | "t": 60 937 | }, 938 | "template": { 939 | "data": { 940 | "bar": [ 941 | { 942 | "error_x": { 943 | "color": "rgb(36,36,36)" 944 | }, 945 | "error_y": { 946 | "color": "rgb(36,36,36)" 947 | }, 948 | "marker": { 949 | "line": { 950 | "color": "rgb(234,234,242)", 951 | "width": 0.5 952 | } 953 | }, 954 | "type": "bar" 955 | } 956 | ], 957 | "barpolar": [ 958 | { 959 | "marker": { 960 | "line": { 961 | "color": "rgb(234,234,242)", 962 | "width": 0.5 963 | } 964 | }, 965 | "type": "barpolar" 966 | } 967 | ], 968 | "carpet": [ 969 | { 970 | "aaxis": { 971 | "endlinecolor": "rgb(36,36,36)", 972 | "gridcolor": "white", 973 | "linecolor": "white", 974 | "minorgridcolor": "white", 975 | "startlinecolor": "rgb(36,36,36)" 976 | }, 977 | "baxis": { 978 | "endlinecolor": "rgb(36,36,36)", 979 | "gridcolor": "white", 980 | "linecolor": "white", 981 | "minorgridcolor": "white", 982 | "startlinecolor": "rgb(36,36,36)" 983 | }, 984 | "type": "carpet" 985 | } 986 | ], 987 | "choropleth": [ 988 | { 989 | "colorbar": { 990 | "outlinewidth": 0, 991 | "tickcolor": "rgb(36,36,36)", 992 | "ticklen": 8, 993 | "ticks": "outside", 994 | "tickwidth": 2 995 | }, 996 | "type": "choropleth" 997 | } 998 | ], 999 | "contour": [ 1000 | { 1001 | "colorbar": { 1002 | "outlinewidth": 0, 1003 | "tickcolor": "rgb(36,36,36)", 1004 | "ticklen": 8, 1005 | "ticks": "outside", 1006 | "tickwidth": 2 1007 | }, 1008 | "colorscale": [ 1009 | [ 1010 | 0, 1011 | "rgb(2,4,25)" 1012 | ], 1013 | [ 1014 | 0.06274509803921569, 1015 | "rgb(24,15,41)" 1016 | ], 1017 | [ 1018 | 0.12549019607843137, 1019 | "rgb(47,23,57)" 1020 | ], 1021 | [ 1022 | 0.18823529411764706, 1023 | "rgb(71,28,72)" 1024 | ], 1025 | [ 1026 | 0.25098039215686274, 1027 | "rgb(97,30,82)" 1028 | ], 1029 | [ 1030 | 0.3137254901960784, 1031 | "rgb(123,30,89)" 1032 | ], 1033 | [ 1034 | 0.3764705882352941, 1035 | "rgb(150,27,91)" 1036 | ], 1037 | [ 1038 | 0.4392156862745098, 1039 | "rgb(177,22,88)" 1040 | ], 1041 | [ 1042 | 0.5019607843137255, 1043 | "rgb(203,26,79)" 1044 | ], 1045 | [ 1046 | 0.5647058823529412, 1047 | "rgb(223,47,67)" 1048 | ], 1049 | [ 1050 | 0.6274509803921569, 1051 | "rgb(236,76,61)" 1052 | ], 1053 | [ 1054 | 0.6901960784313725, 1055 | "rgb(242,107,73)" 1056 | ], 1057 | [ 1058 | 0.7529411764705882, 1059 | "rgb(244,135,95)" 1060 | ], 1061 | [ 1062 | 0.8156862745098039, 1063 | "rgb(245,162,122)" 1064 | ], 1065 | [ 1066 | 0.8784313725490196, 1067 | "rgb(246,188,153)" 1068 | ], 1069 | [ 1070 | 0.9411764705882353, 1071 | "rgb(247,212,187)" 1072 | ], 1073 | [ 1074 | 1, 1075 | "rgb(250,234,220)" 1076 | ] 1077 | ], 1078 | "type": "contour" 1079 | } 1080 | ], 1081 | "contourcarpet": [ 1082 | { 1083 | "colorbar": { 1084 | "outlinewidth": 0, 1085 | "tickcolor": "rgb(36,36,36)", 1086 | "ticklen": 8, 1087 | "ticks": "outside", 1088 | "tickwidth": 2 1089 | }, 1090 | "type": "contourcarpet" 1091 | } 1092 | ], 1093 | "heatmap": [ 1094 | { 1095 | "colorbar": { 1096 | "outlinewidth": 0, 1097 | "tickcolor": "rgb(36,36,36)", 1098 | "ticklen": 8, 1099 | "ticks": "outside", 1100 | "tickwidth": 2 1101 | }, 1102 | "colorscale": [ 1103 | [ 1104 | 0, 1105 | "rgb(2,4,25)" 1106 | ], 1107 | [ 1108 | 0.06274509803921569, 1109 | "rgb(24,15,41)" 1110 | ], 1111 | [ 1112 | 0.12549019607843137, 1113 | "rgb(47,23,57)" 1114 | ], 1115 | [ 1116 | 0.18823529411764706, 1117 | "rgb(71,28,72)" 1118 | ], 1119 | [ 1120 | 0.25098039215686274, 1121 | "rgb(97,30,82)" 1122 | ], 1123 | [ 1124 | 0.3137254901960784, 1125 | "rgb(123,30,89)" 1126 | ], 1127 | [ 1128 | 0.3764705882352941, 1129 | "rgb(150,27,91)" 1130 | ], 1131 | [ 1132 | 0.4392156862745098, 1133 | "rgb(177,22,88)" 1134 | ], 1135 | [ 1136 | 0.5019607843137255, 1137 | "rgb(203,26,79)" 1138 | ], 1139 | [ 1140 | 0.5647058823529412, 1141 | "rgb(223,47,67)" 1142 | ], 1143 | [ 1144 | 0.6274509803921569, 1145 | "rgb(236,76,61)" 1146 | ], 1147 | [ 1148 | 0.6901960784313725, 1149 | "rgb(242,107,73)" 1150 | ], 1151 | [ 1152 | 0.7529411764705882, 1153 | "rgb(244,135,95)" 1154 | ], 1155 | [ 1156 | 0.8156862745098039, 1157 | "rgb(245,162,122)" 1158 | ], 1159 | [ 1160 | 0.8784313725490196, 1161 | "rgb(246,188,153)" 1162 | ], 1163 | [ 1164 | 0.9411764705882353, 1165 | "rgb(247,212,187)" 1166 | ], 1167 | [ 1168 | 1, 1169 | "rgb(250,234,220)" 1170 | ] 1171 | ], 1172 | "type": "heatmap" 1173 | } 1174 | ], 1175 | "heatmapgl": [ 1176 | { 1177 | "colorbar": { 1178 | "outlinewidth": 0, 1179 | "tickcolor": "rgb(36,36,36)", 1180 | "ticklen": 8, 1181 | "ticks": "outside", 1182 | "tickwidth": 2 1183 | }, 1184 | "colorscale": [ 1185 | [ 1186 | 0, 1187 | "rgb(2,4,25)" 1188 | ], 1189 | [ 1190 | 0.06274509803921569, 1191 | "rgb(24,15,41)" 1192 | ], 1193 | [ 1194 | 0.12549019607843137, 1195 | "rgb(47,23,57)" 1196 | ], 1197 | [ 1198 | 0.18823529411764706, 1199 | "rgb(71,28,72)" 1200 | ], 1201 | [ 1202 | 0.25098039215686274, 1203 | "rgb(97,30,82)" 1204 | ], 1205 | [ 1206 | 0.3137254901960784, 1207 | "rgb(123,30,89)" 1208 | ], 1209 | [ 1210 | 0.3764705882352941, 1211 | "rgb(150,27,91)" 1212 | ], 1213 | [ 1214 | 0.4392156862745098, 1215 | "rgb(177,22,88)" 1216 | ], 1217 | [ 1218 | 0.5019607843137255, 1219 | "rgb(203,26,79)" 1220 | ], 1221 | [ 1222 | 0.5647058823529412, 1223 | "rgb(223,47,67)" 1224 | ], 1225 | [ 1226 | 0.6274509803921569, 1227 | "rgb(236,76,61)" 1228 | ], 1229 | [ 1230 | 0.6901960784313725, 1231 | "rgb(242,107,73)" 1232 | ], 1233 | [ 1234 | 0.7529411764705882, 1235 | "rgb(244,135,95)" 1236 | ], 1237 | [ 1238 | 0.8156862745098039, 1239 | "rgb(245,162,122)" 1240 | ], 1241 | [ 1242 | 0.8784313725490196, 1243 | "rgb(246,188,153)" 1244 | ], 1245 | [ 1246 | 0.9411764705882353, 1247 | "rgb(247,212,187)" 1248 | ], 1249 | [ 1250 | 1, 1251 | "rgb(250,234,220)" 1252 | ] 1253 | ], 1254 | "type": "heatmapgl" 1255 | } 1256 | ], 1257 | "histogram": [ 1258 | { 1259 | "marker": { 1260 | "colorbar": { 1261 | "outlinewidth": 0, 1262 | "tickcolor": "rgb(36,36,36)", 1263 | "ticklen": 8, 1264 | "ticks": "outside", 1265 | "tickwidth": 2 1266 | } 1267 | }, 1268 | "type": "histogram" 1269 | } 1270 | ], 1271 | "histogram2d": [ 1272 | { 1273 | "colorbar": { 1274 | "outlinewidth": 0, 1275 | "tickcolor": "rgb(36,36,36)", 1276 | "ticklen": 8, 1277 | "ticks": "outside", 1278 | "tickwidth": 2 1279 | }, 1280 | "colorscale": [ 1281 | [ 1282 | 0, 1283 | "rgb(2,4,25)" 1284 | ], 1285 | [ 1286 | 0.06274509803921569, 1287 | "rgb(24,15,41)" 1288 | ], 1289 | [ 1290 | 0.12549019607843137, 1291 | "rgb(47,23,57)" 1292 | ], 1293 | [ 1294 | 0.18823529411764706, 1295 | "rgb(71,28,72)" 1296 | ], 1297 | [ 1298 | 0.25098039215686274, 1299 | "rgb(97,30,82)" 1300 | ], 1301 | [ 1302 | 0.3137254901960784, 1303 | "rgb(123,30,89)" 1304 | ], 1305 | [ 1306 | 0.3764705882352941, 1307 | "rgb(150,27,91)" 1308 | ], 1309 | [ 1310 | 0.4392156862745098, 1311 | "rgb(177,22,88)" 1312 | ], 1313 | [ 1314 | 0.5019607843137255, 1315 | "rgb(203,26,79)" 1316 | ], 1317 | [ 1318 | 0.5647058823529412, 1319 | "rgb(223,47,67)" 1320 | ], 1321 | [ 1322 | 0.6274509803921569, 1323 | "rgb(236,76,61)" 1324 | ], 1325 | [ 1326 | 0.6901960784313725, 1327 | "rgb(242,107,73)" 1328 | ], 1329 | [ 1330 | 0.7529411764705882, 1331 | "rgb(244,135,95)" 1332 | ], 1333 | [ 1334 | 0.8156862745098039, 1335 | "rgb(245,162,122)" 1336 | ], 1337 | [ 1338 | 0.8784313725490196, 1339 | "rgb(246,188,153)" 1340 | ], 1341 | [ 1342 | 0.9411764705882353, 1343 | "rgb(247,212,187)" 1344 | ], 1345 | [ 1346 | 1, 1347 | "rgb(250,234,220)" 1348 | ] 1349 | ], 1350 | "type": "histogram2d" 1351 | } 1352 | ], 1353 | "histogram2dcontour": [ 1354 | { 1355 | "colorbar": { 1356 | "outlinewidth": 0, 1357 | "tickcolor": "rgb(36,36,36)", 1358 | "ticklen": 8, 1359 | "ticks": "outside", 1360 | "tickwidth": 2 1361 | }, 1362 | "colorscale": [ 1363 | [ 1364 | 0, 1365 | "rgb(2,4,25)" 1366 | ], 1367 | [ 1368 | 0.06274509803921569, 1369 | "rgb(24,15,41)" 1370 | ], 1371 | [ 1372 | 0.12549019607843137, 1373 | "rgb(47,23,57)" 1374 | ], 1375 | [ 1376 | 0.18823529411764706, 1377 | "rgb(71,28,72)" 1378 | ], 1379 | [ 1380 | 0.25098039215686274, 1381 | "rgb(97,30,82)" 1382 | ], 1383 | [ 1384 | 0.3137254901960784, 1385 | "rgb(123,30,89)" 1386 | ], 1387 | [ 1388 | 0.3764705882352941, 1389 | "rgb(150,27,91)" 1390 | ], 1391 | [ 1392 | 0.4392156862745098, 1393 | "rgb(177,22,88)" 1394 | ], 1395 | [ 1396 | 0.5019607843137255, 1397 | "rgb(203,26,79)" 1398 | ], 1399 | [ 1400 | 0.5647058823529412, 1401 | "rgb(223,47,67)" 1402 | ], 1403 | [ 1404 | 0.6274509803921569, 1405 | "rgb(236,76,61)" 1406 | ], 1407 | [ 1408 | 0.6901960784313725, 1409 | "rgb(242,107,73)" 1410 | ], 1411 | [ 1412 | 0.7529411764705882, 1413 | "rgb(244,135,95)" 1414 | ], 1415 | [ 1416 | 0.8156862745098039, 1417 | "rgb(245,162,122)" 1418 | ], 1419 | [ 1420 | 0.8784313725490196, 1421 | "rgb(246,188,153)" 1422 | ], 1423 | [ 1424 | 0.9411764705882353, 1425 | "rgb(247,212,187)" 1426 | ], 1427 | [ 1428 | 1, 1429 | "rgb(250,234,220)" 1430 | ] 1431 | ], 1432 | "type": "histogram2dcontour" 1433 | } 1434 | ], 1435 | "mesh3d": [ 1436 | { 1437 | "colorbar": { 1438 | "outlinewidth": 0, 1439 | "tickcolor": "rgb(36,36,36)", 1440 | "ticklen": 8, 1441 | "ticks": "outside", 1442 | "tickwidth": 2 1443 | }, 1444 | "type": "mesh3d" 1445 | } 1446 | ], 1447 | "parcoords": [ 1448 | { 1449 | "line": { 1450 | "colorbar": { 1451 | "outlinewidth": 0, 1452 | "tickcolor": "rgb(36,36,36)", 1453 | "ticklen": 8, 1454 | "ticks": "outside", 1455 | "tickwidth": 2 1456 | } 1457 | }, 1458 | "type": "parcoords" 1459 | } 1460 | ], 1461 | "pie": [ 1462 | { 1463 | "automargin": true, 1464 | "type": "pie" 1465 | } 1466 | ], 1467 | "scatter": [ 1468 | { 1469 | "marker": { 1470 | "colorbar": { 1471 | "outlinewidth": 0, 1472 | "tickcolor": "rgb(36,36,36)", 1473 | "ticklen": 8, 1474 | "ticks": "outside", 1475 | "tickwidth": 2 1476 | } 1477 | }, 1478 | "type": "scatter" 1479 | } 1480 | ], 1481 | "scatter3d": [ 1482 | { 1483 | "line": { 1484 | "colorbar": { 1485 | "outlinewidth": 0, 1486 | "tickcolor": "rgb(36,36,36)", 1487 | "ticklen": 8, 1488 | "ticks": "outside", 1489 | "tickwidth": 2 1490 | } 1491 | }, 1492 | "marker": { 1493 | "colorbar": { 1494 | "outlinewidth": 0, 1495 | "tickcolor": "rgb(36,36,36)", 1496 | "ticklen": 8, 1497 | "ticks": "outside", 1498 | "tickwidth": 2 1499 | } 1500 | }, 1501 | "type": "scatter3d" 1502 | } 1503 | ], 1504 | "scattercarpet": [ 1505 | { 1506 | "marker": { 1507 | "colorbar": { 1508 | "outlinewidth": 0, 1509 | "tickcolor": "rgb(36,36,36)", 1510 | "ticklen": 8, 1511 | "ticks": "outside", 1512 | "tickwidth": 2 1513 | } 1514 | }, 1515 | "type": "scattercarpet" 1516 | } 1517 | ], 1518 | "scattergeo": [ 1519 | { 1520 | "marker": { 1521 | "colorbar": { 1522 | "outlinewidth": 0, 1523 | "tickcolor": "rgb(36,36,36)", 1524 | "ticklen": 8, 1525 | "ticks": "outside", 1526 | "tickwidth": 2 1527 | } 1528 | }, 1529 | "type": "scattergeo" 1530 | } 1531 | ], 1532 | "scattergl": [ 1533 | { 1534 | "marker": { 1535 | "colorbar": { 1536 | "outlinewidth": 0, 1537 | "tickcolor": "rgb(36,36,36)", 1538 | "ticklen": 8, 1539 | "ticks": "outside", 1540 | "tickwidth": 2 1541 | } 1542 | }, 1543 | "type": "scattergl" 1544 | } 1545 | ], 1546 | "scattermapbox": [ 1547 | { 1548 | "marker": { 1549 | "colorbar": { 1550 | "outlinewidth": 0, 1551 | "tickcolor": "rgb(36,36,36)", 1552 | "ticklen": 8, 1553 | "ticks": "outside", 1554 | "tickwidth": 2 1555 | } 1556 | }, 1557 | "type": "scattermapbox" 1558 | } 1559 | ], 1560 | "scatterpolar": [ 1561 | { 1562 | "marker": { 1563 | "colorbar": { 1564 | "outlinewidth": 0, 1565 | "tickcolor": "rgb(36,36,36)", 1566 | "ticklen": 8, 1567 | "ticks": "outside", 1568 | "tickwidth": 2 1569 | } 1570 | }, 1571 | "type": "scatterpolar" 1572 | } 1573 | ], 1574 | "scatterpolargl": [ 1575 | { 1576 | "marker": { 1577 | "colorbar": { 1578 | "outlinewidth": 0, 1579 | "tickcolor": "rgb(36,36,36)", 1580 | "ticklen": 8, 1581 | "ticks": "outside", 1582 | "tickwidth": 2 1583 | } 1584 | }, 1585 | "type": "scatterpolargl" 1586 | } 1587 | ], 1588 | "scatterternary": [ 1589 | { 1590 | "marker": { 1591 | "colorbar": { 1592 | "outlinewidth": 0, 1593 | "tickcolor": "rgb(36,36,36)", 1594 | "ticklen": 8, 1595 | "ticks": "outside", 1596 | "tickwidth": 2 1597 | } 1598 | }, 1599 | "type": "scatterternary" 1600 | } 1601 | ], 1602 | "surface": [ 1603 | { 1604 | "colorbar": { 1605 | "outlinewidth": 0, 1606 | "tickcolor": "rgb(36,36,36)", 1607 | "ticklen": 8, 1608 | "ticks": "outside", 1609 | "tickwidth": 2 1610 | }, 1611 | "colorscale": [ 1612 | [ 1613 | 0, 1614 | "rgb(2,4,25)" 1615 | ], 1616 | [ 1617 | 0.06274509803921569, 1618 | "rgb(24,15,41)" 1619 | ], 1620 | [ 1621 | 0.12549019607843137, 1622 | "rgb(47,23,57)" 1623 | ], 1624 | [ 1625 | 0.18823529411764706, 1626 | "rgb(71,28,72)" 1627 | ], 1628 | [ 1629 | 0.25098039215686274, 1630 | "rgb(97,30,82)" 1631 | ], 1632 | [ 1633 | 0.3137254901960784, 1634 | "rgb(123,30,89)" 1635 | ], 1636 | [ 1637 | 0.3764705882352941, 1638 | "rgb(150,27,91)" 1639 | ], 1640 | [ 1641 | 0.4392156862745098, 1642 | "rgb(177,22,88)" 1643 | ], 1644 | [ 1645 | 0.5019607843137255, 1646 | "rgb(203,26,79)" 1647 | ], 1648 | [ 1649 | 0.5647058823529412, 1650 | "rgb(223,47,67)" 1651 | ], 1652 | [ 1653 | 0.6274509803921569, 1654 | "rgb(236,76,61)" 1655 | ], 1656 | [ 1657 | 0.6901960784313725, 1658 | "rgb(242,107,73)" 1659 | ], 1660 | [ 1661 | 0.7529411764705882, 1662 | "rgb(244,135,95)" 1663 | ], 1664 | [ 1665 | 0.8156862745098039, 1666 | "rgb(245,162,122)" 1667 | ], 1668 | [ 1669 | 0.8784313725490196, 1670 | "rgb(246,188,153)" 1671 | ], 1672 | [ 1673 | 0.9411764705882353, 1674 | "rgb(247,212,187)" 1675 | ], 1676 | [ 1677 | 1, 1678 | "rgb(250,234,220)" 1679 | ] 1680 | ], 1681 | "type": "surface" 1682 | } 1683 | ], 1684 | "table": [ 1685 | { 1686 | "cells": { 1687 | "fill": { 1688 | "color": "rgb(231,231,240)" 1689 | }, 1690 | "line": { 1691 | "color": "white" 1692 | } 1693 | }, 1694 | "header": { 1695 | "fill": { 1696 | "color": "rgb(183,183,191)" 1697 | }, 1698 | "line": { 1699 | "color": "white" 1700 | } 1701 | }, 1702 | "type": "table" 1703 | } 1704 | ] 1705 | }, 1706 | "layout": { 1707 | "annotationdefaults": { 1708 | "arrowcolor": "rgb(67,103,167)" 1709 | }, 1710 | "coloraxis": { 1711 | "colorbar": { 1712 | "outlinewidth": 0, 1713 | "tickcolor": "rgb(36,36,36)", 1714 | "ticklen": 8, 1715 | "ticks": "outside", 1716 | "tickwidth": 2 1717 | } 1718 | }, 1719 | "colorscale": { 1720 | "sequential": [ 1721 | [ 1722 | 0, 1723 | "rgb(2,4,25)" 1724 | ], 1725 | [ 1726 | 0.06274509803921569, 1727 | "rgb(24,15,41)" 1728 | ], 1729 | [ 1730 | 0.12549019607843137, 1731 | "rgb(47,23,57)" 1732 | ], 1733 | [ 1734 | 0.18823529411764706, 1735 | "rgb(71,28,72)" 1736 | ], 1737 | [ 1738 | 0.25098039215686274, 1739 | "rgb(97,30,82)" 1740 | ], 1741 | [ 1742 | 0.3137254901960784, 1743 | "rgb(123,30,89)" 1744 | ], 1745 | [ 1746 | 0.3764705882352941, 1747 | "rgb(150,27,91)" 1748 | ], 1749 | [ 1750 | 0.4392156862745098, 1751 | "rgb(177,22,88)" 1752 | ], 1753 | [ 1754 | 0.5019607843137255, 1755 | "rgb(203,26,79)" 1756 | ], 1757 | [ 1758 | 0.5647058823529412, 1759 | "rgb(223,47,67)" 1760 | ], 1761 | [ 1762 | 0.6274509803921569, 1763 | "rgb(236,76,61)" 1764 | ], 1765 | [ 1766 | 0.6901960784313725, 1767 | "rgb(242,107,73)" 1768 | ], 1769 | [ 1770 | 0.7529411764705882, 1771 | "rgb(244,135,95)" 1772 | ], 1773 | [ 1774 | 0.8156862745098039, 1775 | "rgb(245,162,122)" 1776 | ], 1777 | [ 1778 | 0.8784313725490196, 1779 | "rgb(246,188,153)" 1780 | ], 1781 | [ 1782 | 0.9411764705882353, 1783 | "rgb(247,212,187)" 1784 | ], 1785 | [ 1786 | 1, 1787 | "rgb(250,234,220)" 1788 | ] 1789 | ], 1790 | "sequentialminus": [ 1791 | [ 1792 | 0, 1793 | "rgb(2,4,25)" 1794 | ], 1795 | [ 1796 | 0.06274509803921569, 1797 | "rgb(24,15,41)" 1798 | ], 1799 | [ 1800 | 0.12549019607843137, 1801 | "rgb(47,23,57)" 1802 | ], 1803 | [ 1804 | 0.18823529411764706, 1805 | "rgb(71,28,72)" 1806 | ], 1807 | [ 1808 | 0.25098039215686274, 1809 | "rgb(97,30,82)" 1810 | ], 1811 | [ 1812 | 0.3137254901960784, 1813 | "rgb(123,30,89)" 1814 | ], 1815 | [ 1816 | 0.3764705882352941, 1817 | "rgb(150,27,91)" 1818 | ], 1819 | [ 1820 | 0.4392156862745098, 1821 | "rgb(177,22,88)" 1822 | ], 1823 | [ 1824 | 0.5019607843137255, 1825 | "rgb(203,26,79)" 1826 | ], 1827 | [ 1828 | 0.5647058823529412, 1829 | "rgb(223,47,67)" 1830 | ], 1831 | [ 1832 | 0.6274509803921569, 1833 | "rgb(236,76,61)" 1834 | ], 1835 | [ 1836 | 0.6901960784313725, 1837 | "rgb(242,107,73)" 1838 | ], 1839 | [ 1840 | 0.7529411764705882, 1841 | "rgb(244,135,95)" 1842 | ], 1843 | [ 1844 | 0.8156862745098039, 1845 | "rgb(245,162,122)" 1846 | ], 1847 | [ 1848 | 0.8784313725490196, 1849 | "rgb(246,188,153)" 1850 | ], 1851 | [ 1852 | 0.9411764705882353, 1853 | "rgb(247,212,187)" 1854 | ], 1855 | [ 1856 | 1, 1857 | "rgb(250,234,220)" 1858 | ] 1859 | ] 1860 | }, 1861 | "colorway": [ 1862 | "rgb(76,114,176)", 1863 | "rgb(221,132,82)", 1864 | "rgb(85,168,104)", 1865 | "rgb(196,78,82)", 1866 | "rgb(129,114,179)", 1867 | "rgb(147,120,96)", 1868 | "rgb(218,139,195)", 1869 | "rgb(140,140,140)", 1870 | "rgb(204,185,116)", 1871 | "rgb(100,181,205)" 1872 | ], 1873 | "font": { 1874 | "color": "rgb(36,36,36)" 1875 | }, 1876 | "geo": { 1877 | "bgcolor": "white", 1878 | "lakecolor": "white", 1879 | "landcolor": "rgb(234,234,242)", 1880 | "showlakes": true, 1881 | "showland": true, 1882 | "subunitcolor": "white" 1883 | }, 1884 | "hoverlabel": { 1885 | "align": "left" 1886 | }, 1887 | "hovermode": "closest", 1888 | "paper_bgcolor": "white", 1889 | "plot_bgcolor": "rgb(234,234,242)", 1890 | "polar": { 1891 | "angularaxis": { 1892 | "gridcolor": "white", 1893 | "linecolor": "white", 1894 | "showgrid": true, 1895 | "ticks": "" 1896 | }, 1897 | "bgcolor": "rgb(234,234,242)", 1898 | "radialaxis": { 1899 | "gridcolor": "white", 1900 | "linecolor": "white", 1901 | "showgrid": true, 1902 | "ticks": "" 1903 | } 1904 | }, 1905 | "scene": { 1906 | "xaxis": { 1907 | "backgroundcolor": "rgb(234,234,242)", 1908 | "gridcolor": "white", 1909 | "gridwidth": 2, 1910 | "linecolor": "white", 1911 | "showbackground": true, 1912 | "showgrid": true, 1913 | "ticks": "", 1914 | "zerolinecolor": "white" 1915 | }, 1916 | "yaxis": { 1917 | "backgroundcolor": "rgb(234,234,242)", 1918 | "gridcolor": "white", 1919 | "gridwidth": 2, 1920 | "linecolor": "white", 1921 | "showbackground": true, 1922 | "showgrid": true, 1923 | "ticks": "", 1924 | "zerolinecolor": "white" 1925 | }, 1926 | "zaxis": { 1927 | "backgroundcolor": "rgb(234,234,242)", 1928 | "gridcolor": "white", 1929 | "gridwidth": 2, 1930 | "linecolor": "white", 1931 | "showbackground": true, 1932 | "showgrid": true, 1933 | "ticks": "", 1934 | "zerolinecolor": "white" 1935 | } 1936 | }, 1937 | "shapedefaults": { 1938 | "fillcolor": "rgb(67,103,167)", 1939 | "line": { 1940 | "width": 0 1941 | }, 1942 | "opacity": 0.5 1943 | }, 1944 | "ternary": { 1945 | "aaxis": { 1946 | "gridcolor": "white", 1947 | "linecolor": "white", 1948 | "showgrid": true, 1949 | "ticks": "" 1950 | }, 1951 | "baxis": { 1952 | "gridcolor": "white", 1953 | "linecolor": "white", 1954 | "showgrid": true, 1955 | "ticks": "" 1956 | }, 1957 | "bgcolor": "rgb(234,234,242)", 1958 | "caxis": { 1959 | "gridcolor": "white", 1960 | "linecolor": "white", 1961 | "showgrid": true, 1962 | "ticks": "" 1963 | } 1964 | }, 1965 | "xaxis": { 1966 | "automargin": true, 1967 | "gridcolor": "white", 1968 | "linecolor": "white", 1969 | "showgrid": true, 1970 | "ticks": "", 1971 | "title": { 1972 | "standoff": 15 1973 | }, 1974 | "zerolinecolor": "white" 1975 | }, 1976 | "yaxis": { 1977 | "automargin": true, 1978 | "gridcolor": "white", 1979 | "linecolor": "white", 1980 | "showgrid": true, 1981 | "ticks": "", 1982 | "title": { 1983 | "standoff": 15 1984 | }, 1985 | "zerolinecolor": "white" 1986 | } 1987 | } 1988 | }, 1989 | "xaxis": { 1990 | "anchor": "y", 1991 | "domain": [ 1992 | 0, 1993 | 1 1994 | ], 1995 | "layer": "below traces", 1996 | "range": [ 1997 | "2021-01-01T00:00:00", 1998 | "2021-12-31T00:00:00" 1999 | ], 2000 | "rangeslider": { 2001 | "visible": true 2002 | }, 2003 | "showgrid": true, 2004 | "side": "top", 2005 | "tickfont": { 2006 | "color": "darkgray", 2007 | "family": "Old Standard TT, serif", 2008 | "size": 16 2009 | }, 2010 | "tickformat": "End of Q%q
%d %B
%Y", 2011 | "ticklen": 2, 2012 | "tickmode": "array", 2013 | "ticks": "outside", 2014 | "tickson": "boundaries", 2015 | "tickvals": [ 2016 | "2021-03-31T00:00:00", 2017 | "2021-06-30T00:00:00", 2018 | "2021-09-30T00:00:00", 2019 | "2021-12-31T00:00:00" 2020 | ], 2021 | "tickwidth": 0.1, 2022 | "type": "date" 2023 | }, 2024 | "yaxis": { 2025 | "anchor": "x", 2026 | "automargin": true, 2027 | "categoryarray": [ 2028 | "Governance Model Dev-Self-Service, Productionization, Lineage", 2029 | "FHIR Data Architecture", 2030 | "Low-Code Dev Tools", 2031 | "Enterprise Orchestration", 2032 | "Hybrid Cloud Governance, Security and UX, Data Arch, Data Quality Mgmt", 2033 | "Containerization ", 2034 | "Microservices", 2035 | "Event Streaming", 2036 | "Elastic Infrastructure/Dynamic Compute", 2037 | "Resilient/Durable", 2038 | "AI/ML Infrastructure/tools", 2039 | "Self-Service Tools", 2040 | "Decouple compute/storage", 2041 | "Financial Transparency Process Dev", 2042 | "Expansion of Self-Service Models", 2043 | "DevOps, DataOps, MLOps", 2044 | "Expansion of Managed Service Arrangements", 2045 | "Product Mgmt Evolution-Product Advisory Council", 2046 | "Delivery Methodology-Agile, RAD, DevOps, Left Testing, TDD, Low-Code", 2047 | "Organizational Design and Operating Model", 2048 | "Agile DevOps Culture" 2049 | ], 2050 | "categoryorder": "array", 2051 | "domain": [ 2052 | 0, 2053 | 1 2054 | ], 2055 | "showgrid": true, 2056 | "showticklabels": true, 2057 | "tickfont": { 2058 | "color": "black", 2059 | "family": "Old Standard TT, serif", 2060 | "size": 12 2061 | }, 2062 | "ticklen": 3, 2063 | "title": { 2064 | "text": "" 2065 | } 2066 | } 2067 | } 2068 | }, 2069 | "text/html": [ 2070 | "
" 2095 | ] 2096 | }, 2097 | "metadata": {}, 2098 | "output_type": "display_data" 2099 | } 2100 | ], 2101 | "source": [ 2102 | "import pandas as pd\n", 2103 | "import plotly.express as px\n", 2104 | "import plotly.figure_factory as ff\n", 2105 | "\n", 2106 | "df = pd.read_csv('bcbsm_gantt.csv',encoding='latin1')\n", 2107 | "df['Start'] = df['Start'].astype('datetime64')\n", 2108 | "df['Finish'] = df['Finish'].astype('datetime64')\n", 2109 | "# print(df.dtypes)\n", 2110 | "# print(df.head())\n", 2111 | "\n", 2112 | "colors = {'Technology' : 'rgb(30,144,255)'\n", 2113 | " , 'Technology - Date TBD' : 'rgb(211,211,211)'\n", 2114 | " , 'People' : 'rgb(95,158,160)'\n", 2115 | " , 'Process' : 'rgb(0,0,128)'\n", 2116 | " , 'Process - Date TBD' : 'rgb(211,211,210)'}\n", 2117 | "\n", 2118 | "['ggplot2', 'seaborn', 'simple_white', 'plotly',\n", 2119 | "'plotly_white', 'plotly_dark', 'presentation', 'xgridoff',\n", 2120 | "'ygridoff', 'gridon', 'none']\n", 2121 | "# ,ticktext=[\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n", 2122 | "# ,tickformat=\"Q%q %Y \\n %b\" \n", 2123 | "# ,tickvals = pd.date_range('2021-01-01', '2021-12-31', freq='Q')\n", 2124 | "# ,tickformat=\"Q%q %Y \\n %b \\n\"\n", 2125 | "# ,nticks=4\n", 2126 | "# ,tickformat = 'End of Q%q
%d %B
%Y'\n", 2127 | "\n", 2128 | "fig = px.timeline(df\n", 2129 | " , x_start=\"Start\"\n", 2130 | " , x_end=\"Finish\"\n", 2131 | " , y=\"Task\"\n", 2132 | "# , facet_col=\"Dimension\"\n", 2133 | "# , facet_col_wrap=40\n", 2134 | "# , facet_col_spacing=.99\n", 2135 | "# , color_discrete_sequence=['green']*len(df)\n", 2136 | " , color_discrete_sequence=px.colors.qualitative.Prism\n", 2137 | " , category_orders={\"Task\": ['Agile DevOps Culture','Organizational Design and Operating Model',\n", 2138 | " 'Delivery Methodology-Agile, RAD, DevOps, Left Testing, TDD, Low-Code',\n", 2139 | " 'Product Mgmt Evolution-Product Advisory Council','Expansion of Managed Service Arrangements',\n", 2140 | " 'DevOps, DataOps, MLOps','Expansion of Self-Service Models','Financial Transparency Process Dev','Decouple compute/storage',\n", 2141 | " 'Self-Service Tools','AI/ML Infrastructure/tools','Resilient/Durable',\n", 2142 | " 'Elastic Infrastructure/Dynamic Compute','Event Streaming','Microservices','Containerization ',\n", 2143 | " 'Hybrid Cloud Governance, Security and UX, Data Arch, Data Quality Mgmt',\n", 2144 | " 'Enterprise Orchestration','Low-Code Dev Tools','FHIR Data Architecture',\n", 2145 | " 'Governance Model Dev-Self-Service, Productionization, Lineage']}\n", 2146 | " , opacity=.5\n", 2147 | " , range_x=None\n", 2148 | " , range_y=None\n", 2149 | " , template='seaborn'\n", 2150 | " , height=1000\n", 2151 | " , color='Dimension'\n", 2152 | "# , color=colors\n", 2153 | " )\n", 2154 | "\n", 2155 | "fig.update_layout(\n", 2156 | "# title =\"IE 3.0 Gantt Chart 2021\"\n", 2157 | " xaxis_range=[df.Start.min(), df.Finish.max()]\n", 2158 | " ,xaxis = dict(\n", 2159 | " showgrid=True\n", 2160 | " ,rangeslider_visible=True\n", 2161 | " ,side =\"top\"\n", 2162 | " ,tickmode = 'array'\n", 2163 | "# ,ticktext=[\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n", 2164 | " ,tickvals = pd.date_range('2021-01-01', '2021-12-31', freq='Q')\n", 2165 | " ,tickformat = 'End of Q%q
%d %B
%Y'\n", 2166 | " ,ticks=\"outside\"\n", 2167 | " ,tickson=\"boundaries\"\n", 2168 | " ,tickwidth=.1\n", 2169 | "# ,ticklabelmode='period'\n", 2170 | " ,layer='below traces'\n", 2171 | " ,ticklen=2\n", 2172 | " ,tickfont=dict(\n", 2173 | " family='Old Standard TT, serif',\n", 2174 | " size=16,\n", 2175 | " color='darkgray'))\n", 2176 | " ,yaxis = dict(\n", 2177 | " title= \"\"\n", 2178 | " ,automargin=True\n", 2179 | " ,ticklen=3\n", 2180 | " ,showgrid=True\n", 2181 | " ,showticklabels=True\n", 2182 | " ,tickfont=dict(\n", 2183 | " family='Old Standard TT, serif',\n", 2184 | " size=12,\n", 2185 | " color='black'))\n", 2186 | " ,legend=dict(\n", 2187 | " orientation=\"h\",\n", 2188 | " yanchor=\"bottom\",\n", 2189 | " y=1.1,\n", 2190 | " title=\"\",\n", 2191 | " xanchor=\"right\",\n", 2192 | " x=1)\n", 2193 | ")\n", 2194 | "\n", 2195 | "#annotations\n", 2196 | "agile_result = \"Adopt an Agile/DevOps Cultre\"\n", 2197 | "org_design = \"More Aligned to business needs\"\n", 2198 | "delivery_method = \"Visibility of capacity/tasks/outcomes\"\n", 2199 | "prod_mgmt = \"Better IE collaboration\"\n", 2200 | "expansion = \"Elastic cpacity to serve more customers\"\n", 2201 | "devops = \"Automation and greater efficiency\"\n", 2202 | "expand_self_serve= \"Greater flexibility and autonomy\"\n", 2203 | "financial = \"Address Cost Transparency\"\n", 2204 | "decouple = \"Greater flexibility, elasticity and tracking\"\n", 2205 | "self_service = \"Greater access and usage to IE\"\n", 2206 | "ai_ml = \"Streamlined model dev and operations\"\n", 2207 | "resilient = \"Avoid application failures and downtime\"\n", 2208 | "elastic = \"Elastic and flexible for complex workloads\"\n", 2209 | "event_streaming = \"Consistent, real-time, data ingestion\"\n", 2210 | "microservices = \"Enable distributed data integration\"\n", 2211 | "containerization = \"Consumption-based cost, portability, consisten environments\"\n", 2212 | "hybrid = \"Align cloud and networking strategies and simplify access controls implementation\"\n", 2213 | "enterprise_orch = \"Resolved data latency and interoperability\"\n", 2214 | "low_code = \"Business-friendly tools and requires a less technical skillset\"\n", 2215 | "fhir = \"Support bot clinical and non-clinical data\"\n", 2216 | "governance = \"Greater ability for self-service and enhanced data lineage\"\n", 2217 | "fig['layout']['annotations'] += tuple([dict(x='2021-02-25',y=20,text=agile_result, showarrow=False, font=dict(color='black', size=10))])\n", 2218 | "fig['layout']['annotations'] += tuple([dict(x='2021-02-25',y=19,text=org_design, showarrow=False, font=dict(color='black', size=10))])\n", 2219 | "fig['layout']['annotations'] += tuple([dict(x='2021-02-22',y=18,text=delivery_method, showarrow=False, font=dict(color='black', size=10))])\n", 2220 | "fig['layout']['annotations'] += tuple([dict(x='2021-03-08',y=17,text=prod_mgmt, showarrow=False, font=dict(color='black', size=10))])\n", 2221 | "fig['layout']['annotations'] += tuple([dict(x='2021-02-19',y=16,text=expansion, showarrow=False, font=dict(color='black', size=10))])\n", 2222 | "fig['layout']['annotations'] += tuple([dict(x='2021-05-25',y=15,text=devops, showarrow=False, font=dict(color='black', size=10))])\n", 2223 | "fig['layout']['annotations'] += tuple([dict(x='2021-08-28',y=14,text=expand_self_serve, showarrow=False, font=dict(color='black', size=10))])\n", 2224 | "fig['layout']['annotations'] += tuple([dict(x='2021-12-02',y=13,text=financial, showarrow=False, font=dict(color='black', size=10))])\n", 2225 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-18',y=12,text=decouple, showarrow=False, font=dict(color='black', size=10))])\n", 2226 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-28',y=11,text=self_service, showarrow=False, font=dict(color='black', size=10))])\n", 2227 | "fig['layout']['annotations'] += tuple([dict(x='2021-08-22',y=10,text=ai_ml, showarrow=False, font=dict(color='black', size=10))])\n", 2228 | "fig['layout']['annotations'] += tuple([dict(x='2021-08-20',y=9,text=resilient, showarrow=False, font=dict(color='black', size=10))])\n", 2229 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-19',y=8,text=elastic, showarrow=False, font=dict(color='black', size=10))])\n", 2230 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-22',y=7,text=event_streaming, showarrow=False, font=dict(color='black', size=10))])\n", 2231 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-25',y=6,text=microservices, showarrow=False, font=dict(color='black', size=10))])\n", 2232 | "fig['layout']['annotations'] += tuple([dict(x='2021-10-30',y=5,text=containerization, showarrow=False, font=dict(color='black', size=10))])\n", 2233 | "fig['layout']['annotations'] += tuple([dict(x='2021-10-09',y=4,text=hybrid, showarrow=False, font=dict(color='black', size=10))])\n", 2234 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-18',y=3,text=enterprise_orch, showarrow=False, font=dict(color='black', size=10))])\n", 2235 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-01',y=2,text=low_code, showarrow=False, font=dict(color='black', size=10))])\n", 2236 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-19',y=1,text=fhir, showarrow=False, font=dict(color='black', size=10))])\n", 2237 | "fig['layout']['annotations'] += tuple([dict(x='2021-11-01',y=0,text=governance, showarrow=False, font=dict(color='black', size=10))])\n", 2238 | "\n", 2239 | "fig.show()" 2240 | ] 2241 | }, 2242 | { 2243 | "cell_type": "code", 2244 | "execution_count": 476, 2245 | "metadata": {}, 2246 | "outputs": [ 2247 | { 2248 | "name": "stdout", 2249 | "output_type": "stream", 2250 | "text": [ 2251 | "Dash is running on http://127.0.0.1:8050/\n", 2252 | "\n", 2253 | "Dash is running on http://127.0.0.1:8050/\n", 2254 | "\n", 2255 | "Dash is running on http://127.0.0.1:8050/\n", 2256 | "\n", 2257 | " * Serving Flask app \"__main__\" (lazy loading)\n", 2258 | " * Environment: production\n", 2259 | " WARNING: This is a development server. Do not use it in a production deployment.\n", 2260 | " Use a production WSGI server instead.\n", 2261 | " * Debug mode: on\n" 2262 | ] 2263 | }, 2264 | { 2265 | "ename": "SystemExit", 2266 | "evalue": "1", 2267 | "output_type": "error", 2268 | "traceback": [ 2269 | "An exception has occurred, use %tb to see the full traceback.\n", 2270 | "\u001b[1;31mSystemExit\u001b[0m\u001b[1;31m:\u001b[0m 1\n" 2271 | ] 2272 | } 2273 | ], 2274 | "source": [ 2275 | "import dash\n", 2276 | "import dash_core_components as dcc\n", 2277 | "import dash_html_components as html\n", 2278 | "from dash.dependencies import Input, Output\n", 2279 | "import plotly.graph_objects as go\n", 2280 | "\n", 2281 | "app = dash.Dash(__name__)\n", 2282 | "\n", 2283 | "app.layout = html.Div([\n", 2284 | " dcc.Graph(id=\"graph\"),\n", 2285 | " dcc.Checklist(\n", 2286 | " id='tick',\n", 2287 | " options=[{'label': 'Enable Linear Ticks', \n", 2288 | " 'value': 'linear'}],\n", 2289 | " value=['linear']\n", 2290 | " )\n", 2291 | "])\n", 2292 | "\n", 2293 | "@app.callback(\n", 2294 | " Output(\"graph\", \"figure\"), \n", 2295 | " [Input(\"tick\", \"value\")])\n", 2296 | "def display_figure(tick_mode):\n", 2297 | " fig = px.timeline(df\n", 2298 | " , x_start=\"Start\"\n", 2299 | " , x_end=\"Finish\"\n", 2300 | " , y=\"Task\"\n", 2301 | " , color_discrete_sequence=px.colors.qualitative.Alphabet\n", 2302 | " , category_orders={\"Task\": ['Agile DevOps Culture',\n", 2303 | " 'Organizational Design and Operating Model',\n", 2304 | " 'Delivery Methodology-Agile, RAD, DevOps, Left Testing, TDD, Low-Code',\n", 2305 | " 'Product Mgmt Evolution-Product Advisory Council',\n", 2306 | " 'Expansion of Managed Service Arrangements',\n", 2307 | " 'DevOps, DataOps, MLOps',\n", 2308 | " 'Expansion of Self-Service Models',\n", 2309 | " 'Financial Transparency Process Dev',\n", 2310 | " 'Decouple compute/storage',\n", 2311 | " 'Self-Service Tools',\n", 2312 | " 'AI/ML Infrastructure/tools',\n", 2313 | " 'Resilient/Durable',\n", 2314 | " 'Elastic Infrastructure/Dynamic Compute',\n", 2315 | " 'Event Streaming',\n", 2316 | " 'Microservices',\n", 2317 | " 'Containerization ',\n", 2318 | " 'Hybrid Cloud Governance, Security and UX, Data Arch, Data Quality Mgmt',\n", 2319 | " 'Enterprise Orchestration',\n", 2320 | " 'Low-Code Dev Tools',\n", 2321 | " 'FHIR Data Architecture',\n", 2322 | " 'Governance Model Dev-Self-Service, Productionization, Lineage']}\n", 2323 | " , opacity=.5\n", 2324 | " , range_x=None\n", 2325 | " , range_y=None\n", 2326 | " , template='presentation'\n", 2327 | " , height=1000\n", 2328 | " , color='Dimension'\n", 2329 | " )\n", 2330 | " \n", 2331 | " fig.update_layout(\n", 2332 | " xaxis_range=[df.Start.min(), df.Finish.max()]\n", 2333 | " ,xaxis = dict(\n", 2334 | " showgrid=True\n", 2335 | " ,rangeslider_visible=True\n", 2336 | " ,side =\"top\"\n", 2337 | " ,tickmode = 'array'\n", 2338 | " ,tickvals = pd.date_range('2021-01-01', '2021-12-31', freq='Q')\n", 2339 | " ,tickformat = 'End of Q%q
%d %B
%Y'\n", 2340 | " ,ticks=\"outside\"\n", 2341 | " ,tickson=\"boundaries\"\n", 2342 | " ,tickwidth=.1\n", 2343 | " ,layer='below traces'\n", 2344 | " ,ticklen=2\n", 2345 | " ,tickfont=dict(\n", 2346 | " family='Old Standard TT, serif',\n", 2347 | " size=16,\n", 2348 | " color='darkgray'))\n", 2349 | " ,yaxis = dict(\n", 2350 | " title= \"\"\n", 2351 | " ,automargin=True\n", 2352 | " ,ticklen=3\n", 2353 | " ,showgrid=True\n", 2354 | " ,showticklabels=True\n", 2355 | " ,tickfont=dict(\n", 2356 | " family='Old Standard TT, serif',\n", 2357 | " size=12,\n", 2358 | " color='black'))\n", 2359 | " ,legend=dict(\n", 2360 | " orientation=\"h\",\n", 2361 | " yanchor=\"bottom\",\n", 2362 | " y=1.1,\n", 2363 | " title=\"\",\n", 2364 | " xanchor=\"right\",\n", 2365 | " x=1))\n", 2366 | "\n", 2367 | " #annotations\n", 2368 | " agile_result = \"Adopt an Agile/DevOps Cultre\"\n", 2369 | " org_design = \"More Aligned to business needs\"\n", 2370 | " delivery_method = \"Visibility of capacity/tasks/outcomes\"\n", 2371 | " prod_mgmt = \"Better IE collaboration\"\n", 2372 | " expansion = \"Elastic cpacity to serve more customers\"\n", 2373 | " devops = \"Automation and greater efficiency\"\n", 2374 | " expand_self_serve= \"Greater flexibility and autonomy\"\n", 2375 | " financial = \"Address Cost Transparency\"\n", 2376 | " decouple = \"Greater flexibility, elasticity and tracking\"\n", 2377 | " self_service = \"Greater access and usage to IE\"\n", 2378 | " ai_ml = \"Streamlined model dev and operations\"\n", 2379 | " resilient = \"Avoid application failures and downtime\"\n", 2380 | " elastic = \"Elastic and flexible for complex workloads\"\n", 2381 | " event_streaming = \"Consistent, real-time, data ingestion\"\n", 2382 | " microservices = \"Enable distributed data integration\"\n", 2383 | " containerization = \"Consumption-based cost, portability, consisten environments\"\n", 2384 | " hybrid = \"Align cloud and networking strategies and simplify access controls implementation\"\n", 2385 | " enterprise_orch = \"Resolved data latency and interoperability\"\n", 2386 | " low_code = \"Business-friendly tools and requires a less technical skillset\"\n", 2387 | " fhir = \"Support bot clinical and non-clinical data\"\n", 2388 | " governance = \"Greater ability for self-service and enhanced data lineage\"\n", 2389 | " fig['layout']['annotations'] += tuple([dict(x='2021-02-25',y=20,text=agile_result, showarrow=False, font=dict(color='black', size=10))])\n", 2390 | " fig['layout']['annotations'] += tuple([dict(x='2021-02-25',y=19,text=org_design, showarrow=False, font=dict(color='black', size=10))])\n", 2391 | " fig['layout']['annotations'] += tuple([dict(x='2021-02-22',y=18,text=delivery_method, showarrow=False, font=dict(color='black', size=10))])\n", 2392 | " fig['layout']['annotations'] += tuple([dict(x='2021-03-08',y=17,text=prod_mgmt, showarrow=False, font=dict(color='black', size=10))])\n", 2393 | " fig['layout']['annotations'] += tuple([dict(x='2021-02-19',y=16,text=expansion, showarrow=False, font=dict(color='black', size=10))])\n", 2394 | " fig['layout']['annotations'] += tuple([dict(x='2021-05-25',y=15,text=devops, showarrow=False, font=dict(color='black', size=10))])\n", 2395 | " fig['layout']['annotations'] += tuple([dict(x='2021-08-28',y=14,text=expand_self_serve, showarrow=False, font=dict(color='black', size=10))])\n", 2396 | " fig['layout']['annotations'] += tuple([dict(x='2021-12-02',y=13,text=financial, showarrow=False, font=dict(color='black', size=10))])\n", 2397 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-18',y=12,text=decouple, showarrow=False, font=dict(color='black', size=10))])\n", 2398 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-28',y=11,text=self_service, showarrow=False, font=dict(color='black', size=10))])\n", 2399 | " fig['layout']['annotations'] += tuple([dict(x='2021-08-22',y=10,text=ai_ml, showarrow=False, font=dict(color='black', size=10))])\n", 2400 | " fig['layout']['annotations'] += tuple([dict(x='2021-08-20',y=9,text=resilient, showarrow=False, font=dict(color='black', size=10))])\n", 2401 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-19',y=8,text=elastic, showarrow=False, font=dict(color='black', size=10))])\n", 2402 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-22',y=7,text=event_streaming, showarrow=False, font=dict(color='black', size=10))])\n", 2403 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-25',y=6,text=microservices, showarrow=False, font=dict(color='black', size=10))])\n", 2404 | " fig['layout']['annotations'] += tuple([dict(x='2021-10-30',y=5,text=containerization, showarrow=False, font=dict(color='black', size=10))])\n", 2405 | " fig['layout']['annotations'] += tuple([dict(x='2021-10-09',y=4,text=hybrid, showarrow=False, font=dict(color='black', size=10))])\n", 2406 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-18',y=3,text=enterprise_orch, showarrow=False, font=dict(color='black', size=10))])\n", 2407 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-01',y=2,text=low_code, showarrow=False, font=dict(color='black', size=10))])\n", 2408 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-19',y=1,text=fhir, showarrow=False, font=dict(color='black', size=10))])\n", 2409 | " fig['layout']['annotations'] += tuple([dict(x='2021-11-01',y=0,text=governance, showarrow=False, font=dict(color='black', size=10))])\n", 2410 | "\n", 2411 | " return fig\n", 2412 | "\n", 2413 | "app.run_server(debug=True)" 2414 | ] 2415 | }, 2416 | { 2417 | "cell_type": "code", 2418 | "execution_count": 185, 2419 | "metadata": {}, 2420 | "outputs": [], 2421 | "source": [ 2422 | "df = pd.read_csv('bcbsm_gantt.csv',encoding='latin1')" 2423 | ] 2424 | }, 2425 | { 2426 | "cell_type": "code", 2427 | "execution_count": 186, 2428 | "metadata": {}, 2429 | "outputs": [ 2430 | { 2431 | "name": "stdout", 2432 | "output_type": "stream", 2433 | "text": [ 2434 | "Task object\n", 2435 | "Start datetime64[ns]\n", 2436 | "Finish datetime64[ns]\n", 2437 | "Dimension object\n", 2438 | "dtype: object\n", 2439 | " Task Start Finish \\\n", 2440 | "0 Decouple compute/storage 2021-01-01 2021-12-31 \n", 2441 | "1 Containerization 2021-01-01 2021-12-31 \n", 2442 | "2 Hybrid Cloud Governance, Security and UX, Data... 2021-01-01 2021-12-31 \n", 2443 | "3 Enterprise Orchestration 2021-01-01 2021-12-31 \n", 2444 | "4 Low-Code Dev Tools 2021-01-01 2021-12-31 \n", 2445 | "\n", 2446 | " Dimension \n", 2447 | "0 Technology \n", 2448 | "1 Technology - Date TBD \n", 2449 | "2 Technology - Date TBD \n", 2450 | "3 Technology - Date TBD \n", 2451 | "4 Technology - Date TBD \n" 2452 | ] 2453 | } 2454 | ], 2455 | "source": [ 2456 | "df['Start'] = df['Start'].astype('datetime64')\n", 2457 | "df['Finish'] = df['Finish'].astype('datetime64')\n", 2458 | "print(df.dtypes)\n", 2459 | "print(df.head())" 2460 | ] 2461 | }, 2462 | { 2463 | "cell_type": "code", 2464 | "execution_count": 8, 2465 | "metadata": {}, 2466 | "outputs": [ 2467 | { 2468 | "ename": "ValueError", 2469 | "evalue": "Length mismatch: Expected axis has 5 elements, new values have 4 elements", 2470 | "output_type": "error", 2471 | "traceback": [ 2472 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 2473 | "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", 2474 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Gantt chart in Plotly has mandatory format of data columns\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m'Task'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Start'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Finish'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Dimension'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;31m# tasks_data_plotly['Resource'] = [ 'Critical' if el else 'Not critical' for el in tasks_data_plotly['Resource']]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m colors = {'Technology' : 'rgb(30,144,255)'\n", 2475 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__setattr__\u001b[1;34m(self, name, value)\u001b[0m\n\u001b[0;32m 5285\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5286\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5287\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5288\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5289\u001b[0m \u001b[1;32mpass\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2476 | "\u001b[1;32mpandas\\_libs\\properties.pyx\u001b[0m in \u001b[0;36mpandas._libs.properties.AxisProperty.__set__\u001b[1;34m()\u001b[0m\n", 2477 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m_set_axis\u001b[1;34m(self, axis, labels)\u001b[0m\n\u001b[0;32m 659\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 660\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_set_axis\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 661\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_axis\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 662\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_clear_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 663\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 2478 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36mset_axis\u001b[1;34m(self, axis, new_labels)\u001b[0m\n\u001b[0;32m 175\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 176\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mnew_len\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mold_len\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 177\u001b[1;33m raise ValueError(\n\u001b[0m\u001b[0;32m 178\u001b[0m \u001b[1;34mf\"Length mismatch: Expected axis has {old_len} elements, new \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 179\u001b[0m \u001b[1;34mf\"values have {new_len} elements\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2479 | "\u001b[1;31mValueError\u001b[0m: Length mismatch: Expected axis has 5 elements, new values have 4 elements" 2480 | ] 2481 | } 2482 | ], 2483 | "source": [ 2484 | "# Gantt chart in Plotly has mandatory format of data columns\n", 2485 | "df.columns = ['Task', 'Start', 'Finish', 'Dimension']\n", 2486 | "# tasks_data_plotly['Resource'] = [ 'Critical' if el else 'Not critical' for el in tasks_data_plotly['Resource']]\n", 2487 | "\n", 2488 | "colors = {'Technology' : 'rgb(30,144,255)'\n", 2489 | " , 'Technology - Date TBD' : 'rgb(211,211,211)'\n", 2490 | " , 'People' : 'rgb(95,158,160)'\n", 2491 | " , 'Process' : 'rgb(0,0,128)'\n", 2492 | " , 'Process - Date TBD' : 'rgb(211,211,210)'}\n", 2493 | "\n", 2494 | "fig_plotly = ff.create_gantt(df\n", 2495 | " , colors=colors\n", 2496 | " , index_col='Dimension'\n", 2497 | " , title='Gantt Chart'\n", 2498 | " , show_colorbar=True\n", 2499 | " , bar_width=0.4\n", 2500 | " , showgrid_x=True\n", 2501 | " , showgrid_y=True\n", 2502 | " )\n", 2503 | "fig_plotly.show()" 2504 | ] 2505 | }, 2506 | { 2507 | "cell_type": "code", 2508 | "execution_count": 244, 2509 | "metadata": { 2510 | "scrolled": false 2511 | }, 2512 | "outputs": [ 2513 | { 2514 | "data": { 2515 | "application/vnd.plotly.v1+json": { 2516 | "config": { 2517 | "plotlyServerURL": "https://plot.ly" 2518 | }, 2519 | "data": [ 2520 | { 2521 | "alignmentgroup": "True", 2522 | "base": [ 2523 | "2021-01-01T00:00:00", 2524 | "2021-01-01T00:00:00" 2525 | ], 2526 | "hovertemplate": "Dimension=People
Start=%{base}
Finish=%{x}
Task=%{y}", 2527 | "legendgroup": "People", 2528 | "marker": { 2529 | "color": "#AA0DFE", 2530 | "opacity": 0.5 2531 | }, 2532 | "name": "People", 2533 | "offsetgroup": "People", 2534 | "orientation": "h", 2535 | "showlegend": true, 2536 | "textposition": "auto", 2537 | "type": "bar", 2538 | "x": [ 2539 | 7689600000, 2540 | 7689600000 2541 | ], 2542 | "xaxis": "x", 2543 | "y": [ 2544 | "Agile DevOps Culture", 2545 | "Organizational Design and Operating Model" 2546 | ], 2547 | "yaxis": "y" 2548 | }, 2549 | { 2550 | "alignmentgroup": "True", 2551 | "base": [ 2552 | "2021-01-01T00:00:00", 2553 | "2021-01-01T00:00:00", 2554 | "2021-01-01T00:00:00", 2555 | "2021-04-01T00:00:00", 2556 | "2021-07-01T00:00:00", 2557 | "2021-10-01T00:00:00" 2558 | ], 2559 | "hovertemplate": "Dimension=Process
Start=%{base}
Finish=%{x}
Task=%{y}", 2560 | "legendgroup": "Process", 2561 | "marker": { 2562 | "color": "#3283FE", 2563 | "opacity": 0.5 2564 | }, 2565 | "name": "Process", 2566 | "offsetgroup": "Process", 2567 | "orientation": "h", 2568 | "showlegend": true, 2569 | "textposition": "auto", 2570 | "type": "bar", 2571 | "x": [ 2572 | 7689600000, 2573 | 7689600000, 2574 | 7689600000, 2575 | 7776000000, 2576 | 7862400000, 2577 | 7862400000 2578 | ], 2579 | "xaxis": "x", 2580 | "y": [ 2581 | "Delivery Methodology-Agile, RAD, DevOps, Left Testing, TDD, Low-Code", 2582 | "Product Mgmt Evolution-Product Advisory Council", 2583 | "Expansion of Managed Service Arrangements", 2584 | "DevOps, DataOps, MLOps", 2585 | "Expansion of Self-Service Models", 2586 | "Financial Transparency Process Dev" 2587 | ], 2588 | "yaxis": "y" 2589 | }, 2590 | { 2591 | "alignmentgroup": "True", 2592 | "base": [ 2593 | "2021-01-01T00:00:00", 2594 | "2021-04-01T00:00:00", 2595 | "2021-07-01T00:00:00", 2596 | "2021-07-01T00:00:00", 2597 | "2021-10-01T00:00:00", 2598 | "2021-10-01T00:00:00", 2599 | "2021-10-01T00:00:00" 2600 | ], 2601 | "hovertemplate": "Dimension=Technology
Start=%{base}
Finish=%{x}
Task=%{y}", 2602 | "legendgroup": "Technology", 2603 | "marker": { 2604 | "color": "#85660D", 2605 | "opacity": 0.5 2606 | }, 2607 | "name": "Technology", 2608 | "offsetgroup": "Technology", 2609 | "orientation": "h", 2610 | "showlegend": true, 2611 | "textposition": "auto", 2612 | "type": "bar", 2613 | "x": [ 2614 | 31449600000, 2615 | 23673600000, 2616 | 7862400000, 2617 | 7862400000, 2618 | 7862400000, 2619 | 7862400000, 2620 | 7862400000 2621 | ], 2622 | "xaxis": "x", 2623 | "y": [ 2624 | "Decouple compute/storage", 2625 | "Self-Service Tools", 2626 | "AI/ML Infrastructure/tools", 2627 | "Resilient/Durable", 2628 | "Elastic Infrastructure/Dynamic Compute", 2629 | "Event Streaming", 2630 | "Microservices" 2631 | ], 2632 | "yaxis": "y" 2633 | }, 2634 | { 2635 | "alignmentgroup": "True", 2636 | "base": [ 2637 | "2021-01-01T00:00:00", 2638 | "2021-01-01T00:00:00", 2639 | "2021-01-01T00:00:00", 2640 | "2021-01-01T00:00:00", 2641 | "2021-01-01T00:00:00" 2642 | ], 2643 | "hovertemplate": "Dimension=Technology - Date TBD
Start=%{base}
Finish=%{x}
Task=%{y}", 2644 | "legendgroup": "Technology - Date TBD", 2645 | "marker": { 2646 | "color": "#782AB6", 2647 | "opacity": 0.5 2648 | }, 2649 | "name": "Technology - Date TBD", 2650 | "offsetgroup": "Technology - Date TBD", 2651 | "orientation": "h", 2652 | "showlegend": true, 2653 | "textposition": "auto", 2654 | "type": "bar", 2655 | "x": [ 2656 | 31449600000, 2657 | 31449600000, 2658 | 31449600000, 2659 | 31449600000, 2660 | 31449600000 2661 | ], 2662 | "xaxis": "x", 2663 | "y": [ 2664 | "Containerization ", 2665 | "Hybrid Cloud Governance, Security and UX, Data Arch, Data Quality Mgmt", 2666 | "Enterprise Orchestration", 2667 | "Low-Code Dev Tools", 2668 | "FHIR Data Architecture" 2669 | ], 2670 | "yaxis": "y" 2671 | }, 2672 | { 2673 | "alignmentgroup": "True", 2674 | "base": [ 2675 | "2021-01-01T00:00:00" 2676 | ], 2677 | "hovertemplate": "Dimension=Process - Date TBD
Start=%{base}
Finish=%{x}
Task=%{y}", 2678 | "legendgroup": "Process - Date TBD", 2679 | "marker": { 2680 | "color": "#565656", 2681 | "opacity": 0.5 2682 | }, 2683 | "name": "Process - Date TBD", 2684 | "offsetgroup": "Process - Date TBD", 2685 | "orientation": "h", 2686 | "showlegend": true, 2687 | "textposition": "auto", 2688 | "type": "bar", 2689 | "x": [ 2690 | 31449600000 2691 | ], 2692 | "xaxis": "x", 2693 | "y": [ 2694 | "Governance Model Dev-Self-Service, Productionization, Lineage" 2695 | ], 2696 | "yaxis": "y" 2697 | } 2698 | ], 2699 | "layout": { 2700 | "barmode": "overlay", 2701 | "height": 700, 2702 | "legend": { 2703 | "orientation": "h", 2704 | "title": { 2705 | "text": "Dimension" 2706 | }, 2707 | "tracegroupgap": 0, 2708 | "x": 1, 2709 | "xanchor": "right", 2710 | "y": 1, 2711 | "yanchor": "bottom" 2712 | }, 2713 | "margin": { 2714 | "t": 60 2715 | }, 2716 | "template": { 2717 | "data": { 2718 | "bar": [ 2719 | { 2720 | "error_x": { 2721 | "color": "rgb(51,51,51)" 2722 | }, 2723 | "error_y": { 2724 | "color": "rgb(51,51,51)" 2725 | }, 2726 | "marker": { 2727 | "line": { 2728 | "color": "rgb(237,237,237)", 2729 | "width": 0.5 2730 | } 2731 | }, 2732 | "type": "bar" 2733 | } 2734 | ], 2735 | "barpolar": [ 2736 | { 2737 | "marker": { 2738 | "line": { 2739 | "color": "rgb(237,237,237)", 2740 | "width": 0.5 2741 | } 2742 | }, 2743 | "type": "barpolar" 2744 | } 2745 | ], 2746 | "carpet": [ 2747 | { 2748 | "aaxis": { 2749 | "endlinecolor": "rgb(51,51,51)", 2750 | "gridcolor": "white", 2751 | "linecolor": "white", 2752 | "minorgridcolor": "white", 2753 | "startlinecolor": "rgb(51,51,51)" 2754 | }, 2755 | "baxis": { 2756 | "endlinecolor": "rgb(51,51,51)", 2757 | "gridcolor": "white", 2758 | "linecolor": "white", 2759 | "minorgridcolor": "white", 2760 | "startlinecolor": "rgb(51,51,51)" 2761 | }, 2762 | "type": "carpet" 2763 | } 2764 | ], 2765 | "choropleth": [ 2766 | { 2767 | "colorbar": { 2768 | "outlinewidth": 0, 2769 | "tickcolor": "rgb(237,237,237)", 2770 | "ticklen": 6, 2771 | "ticks": "inside" 2772 | }, 2773 | "type": "choropleth" 2774 | } 2775 | ], 2776 | "contour": [ 2777 | { 2778 | "colorbar": { 2779 | "outlinewidth": 0, 2780 | "tickcolor": "rgb(237,237,237)", 2781 | "ticklen": 6, 2782 | "ticks": "inside" 2783 | }, 2784 | "colorscale": [ 2785 | [ 2786 | 0, 2787 | "rgb(20,44,66)" 2788 | ], 2789 | [ 2790 | 1, 2791 | "rgb(90,179,244)" 2792 | ] 2793 | ], 2794 | "type": "contour" 2795 | } 2796 | ], 2797 | "contourcarpet": [ 2798 | { 2799 | "colorbar": { 2800 | "outlinewidth": 0, 2801 | "tickcolor": "rgb(237,237,237)", 2802 | "ticklen": 6, 2803 | "ticks": "inside" 2804 | }, 2805 | "type": "contourcarpet" 2806 | } 2807 | ], 2808 | "heatmap": [ 2809 | { 2810 | "colorbar": { 2811 | "outlinewidth": 0, 2812 | "tickcolor": "rgb(237,237,237)", 2813 | "ticklen": 6, 2814 | "ticks": "inside" 2815 | }, 2816 | "colorscale": [ 2817 | [ 2818 | 0, 2819 | "rgb(20,44,66)" 2820 | ], 2821 | [ 2822 | 1, 2823 | "rgb(90,179,244)" 2824 | ] 2825 | ], 2826 | "type": "heatmap" 2827 | } 2828 | ], 2829 | "heatmapgl": [ 2830 | { 2831 | "colorbar": { 2832 | "outlinewidth": 0, 2833 | "tickcolor": "rgb(237,237,237)", 2834 | "ticklen": 6, 2835 | "ticks": "inside" 2836 | }, 2837 | "colorscale": [ 2838 | [ 2839 | 0, 2840 | "rgb(20,44,66)" 2841 | ], 2842 | [ 2843 | 1, 2844 | "rgb(90,179,244)" 2845 | ] 2846 | ], 2847 | "type": "heatmapgl" 2848 | } 2849 | ], 2850 | "histogram": [ 2851 | { 2852 | "marker": { 2853 | "colorbar": { 2854 | "outlinewidth": 0, 2855 | "tickcolor": "rgb(237,237,237)", 2856 | "ticklen": 6, 2857 | "ticks": "inside" 2858 | } 2859 | }, 2860 | "type": "histogram" 2861 | } 2862 | ], 2863 | "histogram2d": [ 2864 | { 2865 | "colorbar": { 2866 | "outlinewidth": 0, 2867 | "tickcolor": "rgb(237,237,237)", 2868 | "ticklen": 6, 2869 | "ticks": "inside" 2870 | }, 2871 | "colorscale": [ 2872 | [ 2873 | 0, 2874 | "rgb(20,44,66)" 2875 | ], 2876 | [ 2877 | 1, 2878 | "rgb(90,179,244)" 2879 | ] 2880 | ], 2881 | "type": "histogram2d" 2882 | } 2883 | ], 2884 | "histogram2dcontour": [ 2885 | { 2886 | "colorbar": { 2887 | "outlinewidth": 0, 2888 | "tickcolor": "rgb(237,237,237)", 2889 | "ticklen": 6, 2890 | "ticks": "inside" 2891 | }, 2892 | "colorscale": [ 2893 | [ 2894 | 0, 2895 | "rgb(20,44,66)" 2896 | ], 2897 | [ 2898 | 1, 2899 | "rgb(90,179,244)" 2900 | ] 2901 | ], 2902 | "type": "histogram2dcontour" 2903 | } 2904 | ], 2905 | "mesh3d": [ 2906 | { 2907 | "colorbar": { 2908 | "outlinewidth": 0, 2909 | "tickcolor": "rgb(237,237,237)", 2910 | "ticklen": 6, 2911 | "ticks": "inside" 2912 | }, 2913 | "type": "mesh3d" 2914 | } 2915 | ], 2916 | "parcoords": [ 2917 | { 2918 | "line": { 2919 | "colorbar": { 2920 | "outlinewidth": 0, 2921 | "tickcolor": "rgb(237,237,237)", 2922 | "ticklen": 6, 2923 | "ticks": "inside" 2924 | } 2925 | }, 2926 | "type": "parcoords" 2927 | } 2928 | ], 2929 | "pie": [ 2930 | { 2931 | "automargin": true, 2932 | "type": "pie" 2933 | } 2934 | ], 2935 | "scatter": [ 2936 | { 2937 | "marker": { 2938 | "colorbar": { 2939 | "outlinewidth": 0, 2940 | "tickcolor": "rgb(237,237,237)", 2941 | "ticklen": 6, 2942 | "ticks": "inside" 2943 | } 2944 | }, 2945 | "type": "scatter" 2946 | } 2947 | ], 2948 | "scatter3d": [ 2949 | { 2950 | "line": { 2951 | "colorbar": { 2952 | "outlinewidth": 0, 2953 | "tickcolor": "rgb(237,237,237)", 2954 | "ticklen": 6, 2955 | "ticks": "inside" 2956 | } 2957 | }, 2958 | "marker": { 2959 | "colorbar": { 2960 | "outlinewidth": 0, 2961 | "tickcolor": "rgb(237,237,237)", 2962 | "ticklen": 6, 2963 | "ticks": "inside" 2964 | } 2965 | }, 2966 | "type": "scatter3d" 2967 | } 2968 | ], 2969 | "scattercarpet": [ 2970 | { 2971 | "marker": { 2972 | "colorbar": { 2973 | "outlinewidth": 0, 2974 | "tickcolor": "rgb(237,237,237)", 2975 | "ticklen": 6, 2976 | "ticks": "inside" 2977 | } 2978 | }, 2979 | "type": "scattercarpet" 2980 | } 2981 | ], 2982 | "scattergeo": [ 2983 | { 2984 | "marker": { 2985 | "colorbar": { 2986 | "outlinewidth": 0, 2987 | "tickcolor": "rgb(237,237,237)", 2988 | "ticklen": 6, 2989 | "ticks": "inside" 2990 | } 2991 | }, 2992 | "type": "scattergeo" 2993 | } 2994 | ], 2995 | "scattergl": [ 2996 | { 2997 | "marker": { 2998 | "colorbar": { 2999 | "outlinewidth": 0, 3000 | "tickcolor": "rgb(237,237,237)", 3001 | "ticklen": 6, 3002 | "ticks": "inside" 3003 | } 3004 | }, 3005 | "type": "scattergl" 3006 | } 3007 | ], 3008 | "scattermapbox": [ 3009 | { 3010 | "marker": { 3011 | "colorbar": { 3012 | "outlinewidth": 0, 3013 | "tickcolor": "rgb(237,237,237)", 3014 | "ticklen": 6, 3015 | "ticks": "inside" 3016 | } 3017 | }, 3018 | "type": "scattermapbox" 3019 | } 3020 | ], 3021 | "scatterpolar": [ 3022 | { 3023 | "marker": { 3024 | "colorbar": { 3025 | "outlinewidth": 0, 3026 | "tickcolor": "rgb(237,237,237)", 3027 | "ticklen": 6, 3028 | "ticks": "inside" 3029 | } 3030 | }, 3031 | "type": "scatterpolar" 3032 | } 3033 | ], 3034 | "scatterpolargl": [ 3035 | { 3036 | "marker": { 3037 | "colorbar": { 3038 | "outlinewidth": 0, 3039 | "tickcolor": "rgb(237,237,237)", 3040 | "ticklen": 6, 3041 | "ticks": "inside" 3042 | } 3043 | }, 3044 | "type": "scatterpolargl" 3045 | } 3046 | ], 3047 | "scatterternary": [ 3048 | { 3049 | "marker": { 3050 | "colorbar": { 3051 | "outlinewidth": 0, 3052 | "tickcolor": "rgb(237,237,237)", 3053 | "ticklen": 6, 3054 | "ticks": "inside" 3055 | } 3056 | }, 3057 | "type": "scatterternary" 3058 | } 3059 | ], 3060 | "surface": [ 3061 | { 3062 | "colorbar": { 3063 | "outlinewidth": 0, 3064 | "tickcolor": "rgb(237,237,237)", 3065 | "ticklen": 6, 3066 | "ticks": "inside" 3067 | }, 3068 | "colorscale": [ 3069 | [ 3070 | 0, 3071 | "rgb(20,44,66)" 3072 | ], 3073 | [ 3074 | 1, 3075 | "rgb(90,179,244)" 3076 | ] 3077 | ], 3078 | "type": "surface" 3079 | } 3080 | ], 3081 | "table": [ 3082 | { 3083 | "cells": { 3084 | "fill": { 3085 | "color": "rgb(237,237,237)" 3086 | }, 3087 | "line": { 3088 | "color": "white" 3089 | } 3090 | }, 3091 | "header": { 3092 | "fill": { 3093 | "color": "rgb(217,217,217)" 3094 | }, 3095 | "line": { 3096 | "color": "white" 3097 | } 3098 | }, 3099 | "type": "table" 3100 | } 3101 | ] 3102 | }, 3103 | "layout": { 3104 | "annotationdefaults": { 3105 | "arrowhead": 0, 3106 | "arrowwidth": 1 3107 | }, 3108 | "coloraxis": { 3109 | "colorbar": { 3110 | "outlinewidth": 0, 3111 | "tickcolor": "rgb(237,237,237)", 3112 | "ticklen": 6, 3113 | "ticks": "inside" 3114 | } 3115 | }, 3116 | "colorscale": { 3117 | "sequential": [ 3118 | [ 3119 | 0, 3120 | "rgb(20,44,66)" 3121 | ], 3122 | [ 3123 | 1, 3124 | "rgb(90,179,244)" 3125 | ] 3126 | ], 3127 | "sequentialminus": [ 3128 | [ 3129 | 0, 3130 | "rgb(20,44,66)" 3131 | ], 3132 | [ 3133 | 1, 3134 | "rgb(90,179,244)" 3135 | ] 3136 | ] 3137 | }, 3138 | "colorway": [ 3139 | "#F8766D", 3140 | "#A3A500", 3141 | "#00BF7D", 3142 | "#00B0F6", 3143 | "#E76BF3" 3144 | ], 3145 | "font": { 3146 | "color": "rgb(51,51,51)" 3147 | }, 3148 | "geo": { 3149 | "bgcolor": "white", 3150 | "lakecolor": "white", 3151 | "landcolor": "rgb(237,237,237)", 3152 | "showlakes": true, 3153 | "showland": true, 3154 | "subunitcolor": "white" 3155 | }, 3156 | "hoverlabel": { 3157 | "align": "left" 3158 | }, 3159 | "hovermode": "closest", 3160 | "paper_bgcolor": "white", 3161 | "plot_bgcolor": "rgb(237,237,237)", 3162 | "polar": { 3163 | "angularaxis": { 3164 | "gridcolor": "white", 3165 | "linecolor": "white", 3166 | "showgrid": true, 3167 | "tickcolor": "rgb(51,51,51)", 3168 | "ticks": "outside" 3169 | }, 3170 | "bgcolor": "rgb(237,237,237)", 3171 | "radialaxis": { 3172 | "gridcolor": "white", 3173 | "linecolor": "white", 3174 | "showgrid": true, 3175 | "tickcolor": "rgb(51,51,51)", 3176 | "ticks": "outside" 3177 | } 3178 | }, 3179 | "scene": { 3180 | "xaxis": { 3181 | "backgroundcolor": "rgb(237,237,237)", 3182 | "gridcolor": "white", 3183 | "gridwidth": 2, 3184 | "linecolor": "white", 3185 | "showbackground": true, 3186 | "showgrid": true, 3187 | "tickcolor": "rgb(51,51,51)", 3188 | "ticks": "outside", 3189 | "zerolinecolor": "white" 3190 | }, 3191 | "yaxis": { 3192 | "backgroundcolor": "rgb(237,237,237)", 3193 | "gridcolor": "white", 3194 | "gridwidth": 2, 3195 | "linecolor": "white", 3196 | "showbackground": true, 3197 | "showgrid": true, 3198 | "tickcolor": "rgb(51,51,51)", 3199 | "ticks": "outside", 3200 | "zerolinecolor": "white" 3201 | }, 3202 | "zaxis": { 3203 | "backgroundcolor": "rgb(237,237,237)", 3204 | "gridcolor": "white", 3205 | "gridwidth": 2, 3206 | "linecolor": "white", 3207 | "showbackground": true, 3208 | "showgrid": true, 3209 | "tickcolor": "rgb(51,51,51)", 3210 | "ticks": "outside", 3211 | "zerolinecolor": "white" 3212 | } 3213 | }, 3214 | "shapedefaults": { 3215 | "fillcolor": "black", 3216 | "line": { 3217 | "width": 0 3218 | }, 3219 | "opacity": 0.3 3220 | }, 3221 | "ternary": { 3222 | "aaxis": { 3223 | "gridcolor": "white", 3224 | "linecolor": "white", 3225 | "showgrid": true, 3226 | "tickcolor": "rgb(51,51,51)", 3227 | "ticks": "outside" 3228 | }, 3229 | "baxis": { 3230 | "gridcolor": "white", 3231 | "linecolor": "white", 3232 | "showgrid": true, 3233 | "tickcolor": "rgb(51,51,51)", 3234 | "ticks": "outside" 3235 | }, 3236 | "bgcolor": "rgb(237,237,237)", 3237 | "caxis": { 3238 | "gridcolor": "white", 3239 | "linecolor": "white", 3240 | "showgrid": true, 3241 | "tickcolor": "rgb(51,51,51)", 3242 | "ticks": "outside" 3243 | } 3244 | }, 3245 | "xaxis": { 3246 | "automargin": true, 3247 | "gridcolor": "white", 3248 | "linecolor": "white", 3249 | "showgrid": true, 3250 | "tickcolor": "rgb(51,51,51)", 3251 | "ticks": "outside", 3252 | "title": { 3253 | "standoff": 15 3254 | }, 3255 | "zerolinecolor": "white" 3256 | }, 3257 | "yaxis": { 3258 | "automargin": true, 3259 | "gridcolor": "white", 3260 | "linecolor": "white", 3261 | "showgrid": true, 3262 | "tickcolor": "rgb(51,51,51)", 3263 | "ticks": "outside", 3264 | "title": { 3265 | "standoff": 15 3266 | }, 3267 | "zerolinecolor": "white" 3268 | } 3269 | } 3270 | }, 3271 | "title": { 3272 | "text": "IE 3.0 Gantt Chart 2021" 3273 | }, 3274 | "xaxis": { 3275 | "anchor": "y", 3276 | "domain": [ 3277 | 0, 3278 | 1 3279 | ], 3280 | "range": [ 3281 | "2021-01-01T00:00:00", 3282 | "2021-12-31T00:00:00" 3283 | ], 3284 | "rangeslider": { 3285 | "visible": true 3286 | }, 3287 | "showgrid": true, 3288 | "tickfont": { 3289 | "color": "black", 3290 | "family": "Old Standard TT, serif", 3291 | "size": 20 3292 | }, 3293 | "tickformat": "%b", 3294 | "tickmode": "array", 3295 | "ticks": "outside", 3296 | "tickson": "labels", 3297 | "ticktext": [ 3298 | "Q1", 3299 | "Q2", 3300 | "Q3", 3301 | "Q4" 3302 | ], 3303 | "tickvals": [ 3304 | "2021-03-31T00:00:00", 3305 | "2021-06-30T00:00:00", 3306 | "2021-09-30T00:00:00", 3307 | "2021-12-31T00:00:00" 3308 | ], 3309 | "type": "date" 3310 | }, 3311 | "yaxis": { 3312 | "anchor": "x", 3313 | "automargin": true, 3314 | "domain": [ 3315 | 0, 3316 | 1 3317 | ], 3318 | "showgrid": true, 3319 | "showticklabels": true, 3320 | "tickfont": { 3321 | "color": "black", 3322 | "family": "Old Standard TT, serif", 3323 | "size": 12 3324 | }, 3325 | "title": { 3326 | "text": "Initiatives" 3327 | } 3328 | } 3329 | } 3330 | }, 3331 | "text/html": [ 3332 | "
" 3357 | ] 3358 | }, 3359 | "metadata": {}, 3360 | "output_type": "display_data" 3361 | } 3362 | ], 3363 | "source": [ 3364 | "colors = {'Technology' : 'rgb(30,144,255)'\n", 3365 | " , 'Technology - Date TBD' : 'rgb(211,211,211)'\n", 3366 | " , 'People' : 'rgb(95,158,160)'\n", 3367 | " , 'Process' : 'rgb(0,0,128)'\n", 3368 | " , 'Process - Date TBD' : 'rgb(211,211,210)'}\n", 3369 | "\n", 3370 | "fig = px.timeline(df\n", 3371 | " , x_start=\"Start\"\n", 3372 | " , x_end=\"Finish\"\n", 3373 | " , y=\"Task\"\n", 3374 | "# , color_discrete_sequence=['green']*len(df)\n", 3375 | " , color_discrete_sequence=px.colors.qualitative.Alphabet\n", 3376 | " , opacity=.5\n", 3377 | " , range_x=None\n", 3378 | " , range_y=None\n", 3379 | " , template='ggplot2'\n", 3380 | "# , width=1000\n", 3381 | " , height=700\n", 3382 | "# , labels={'x': 'Some X', 'y':'Some Y'}\n", 3383 | " , color='Dimension'\n", 3384 | "# , color=colors\n", 3385 | " )\n", 3386 | "\n", 3387 | "fig.update_layout(\n", 3388 | " title = \"IE 3.0 Gantt Chart 2021\"\n", 3389 | " ,xaxis_range=[df.Start.min(), df.Finish.max()]\n", 3390 | " ,xaxis = dict(\n", 3391 | " showgrid=True\n", 3392 | " ,rangeslider_visible=True\n", 3393 | "# ,title='Quarter'\n", 3394 | " ,tickmode = 'array'\n", 3395 | " ,ticktext=[\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n", 3396 | " ,tickvals = pd.date_range('2021-01-01', '2021-12-31', freq='Q')\n", 3397 | " ,tickformat = '%b'\n", 3398 | " ,ticks=\"outside\"\n", 3399 | " ,tickson=\"labels\"\n", 3400 | " ,tickfont=dict(\n", 3401 | " family='Old Standard TT, serif',\n", 3402 | " size=20,\n", 3403 | " color='black'))\n", 3404 | " ,yaxis = dict(\n", 3405 | " title='Initiatives'\n", 3406 | " ,automargin=True\n", 3407 | " ,showgrid=True\n", 3408 | " ,showticklabels=True\n", 3409 | " ,tickfont=dict(\n", 3410 | " family='Old Standard TT, serif',\n", 3411 | " size=12,\n", 3412 | " color='black'))\n", 3413 | " ,legend=dict(\n", 3414 | " orientation=\"h\",\n", 3415 | " yanchor=\"bottom\",\n", 3416 | " y=1.0,\n", 3417 | " xanchor=\"right\",\n", 3418 | " x=1)\n", 3419 | ")\n", 3420 | "\n", 3421 | "fig.show()" 3422 | ] 3423 | }, 3424 | { 3425 | "cell_type": "code", 3426 | "execution_count": null, 3427 | "metadata": {}, 3428 | "outputs": [], 3429 | "source": [] 3430 | }, 3431 | { 3432 | "cell_type": "code", 3433 | "execution_count": null, 3434 | "metadata": {}, 3435 | "outputs": [], 3436 | "source": [ 3437 | " \n", 3438 | "['ggplot2', 'seaborn', 'simple_white', 'plotly',\n", 3439 | "'plotly_white', 'plotly_dark', 'presentation', 'xgridoff',\n", 3440 | "'ygridoff', 'gridon', 'none']\n", 3441 | " \n", 3442 | " - A hex string (e.g. '#ff0000')\n", 3443 | " - An rgb/rgba string (e.g. 'rgb(255,0,0)')\n", 3444 | " - An hsl/hsla string (e.g. 'hsl(0,100%,50%)')\n", 3445 | " - An hsv/hsva string (e.g. 'hsv(0,100%,100%)')\n", 3446 | " - A named CSS color:\n", 3447 | " aliceblue, antiquewhite, aqua, aquamarine, azure,\n", 3448 | " beige, bisque, black, blanchedalmond, blue,\n", 3449 | " blueviolet, brown, burlywood, cadetblue,\n", 3450 | " chartreuse, chocolate, coral, cornflowerblue,\n", 3451 | " cornsilk, crimson, cyan, darkblue, darkcyan,\n", 3452 | " darkgoldenrod, darkgray, darkgrey, darkgreen,\n", 3453 | " darkkhaki, darkmagenta, darkolivegreen, darkorange,\n", 3454 | " darkorchid, darkred, darksalmon, darkseagreen,\n", 3455 | " darkslateblue, darkslategray, darkslategrey,\n", 3456 | " darkturquoise, darkviolet, deeppink, deepskyblue,\n", 3457 | " dimgray, dimgrey, dodgerblue, firebrick,\n", 3458 | " floralwhite, forestgreen, fuchsia, gainsboro,\n", 3459 | " ghostwhite, gold, goldenrod, gray, grey, green,\n", 3460 | " greenyellow, honeydew, hotpink, indianred, indigo,\n", 3461 | " ivory, khaki, lavender, lavenderblush, lawngreen,\n", 3462 | " lemonchiffon, lightblue, lightcoral, lightcyan,\n", 3463 | " lightgoldenrodyellow, lightgray, lightgrey,\n", 3464 | " lightgreen, lightpink, lightsalmon, lightseagreen,\n", 3465 | " lightskyblue, lightslategray, lightslategrey,\n", 3466 | " lightsteelblue, lightyellow, lime, limegreen,\n", 3467 | " linen, magenta, maroon, mediumaquamarine,\n", 3468 | " mediumblue, mediumorchid, mediumpurple,\n", 3469 | " mediumseagreen, mediumslateblue, mediumspringgreen,\n", 3470 | " mediumturquoise, mediumvioletred, midnightblue,\n", 3471 | " mintcream, mistyrose, moccasin, navajowhite, navy,\n", 3472 | " oldlace, olive, olivedrab, orange, orangered,\n", 3473 | " orchid, palegoldenrod, palegreen, paleturquoise,\n", 3474 | " palevioletred, papayawhip, peachpuff, peru, pink,\n", 3475 | " plum, powderblue, purple, red, rosybrown,\n", 3476 | " royalblue, rebeccapurple, saddlebrown, salmon,\n", 3477 | " sandybrown, seagreen, seashell, sienna, silver,\n", 3478 | " skyblue, slateblue, slategray, slategrey, snow,\n", 3479 | " springgreen, steelblue, tan, teal, thistle, tomato,\n", 3480 | " turquoise, violet, wheat, white, whitesmoke,\n", 3481 | " yellow, yellowgreen" 3482 | ] 3483 | }, 3484 | { 3485 | "cell_type": "code", 3486 | "execution_count": null, 3487 | "metadata": {}, 3488 | "outputs": [], 3489 | "source": [ 3490 | "Valid properties:\n", 3491 | " anchor\n", 3492 | " If set to an opposite-letter axis id (e.g. `x2`, `y`),\n", 3493 | " this axis is bound to the corresponding opposite-letter\n", 3494 | " axis. If set to \"free\", this axis' position is\n", 3495 | " determined by `position`.\n", 3496 | " automargin\n", 3497 | " Determines whether long tick labels automatically grow\n", 3498 | " the figure margins.\n", 3499 | " autorange\n", 3500 | " Determines whether or not the range of this axis is\n", 3501 | " computed in relation to the input data. See `rangemode`\n", 3502 | " for more info. If `range` is provided, then `autorange`\n", 3503 | " is set to False.\n", 3504 | " calendar\n", 3505 | " Sets the calendar system to use for `range` and `tick0`\n", 3506 | " if this is a date axis. This does not set the calendar\n", 3507 | " for interpreting data on this axis, that's specified in\n", 3508 | " the trace or via the global `layout.calendar`\n", 3509 | " categoryarray\n", 3510 | " Sets the order in which categories on this axis appear.\n", 3511 | " Only has an effect if `categoryorder` is set to\n", 3512 | " \"array\". Used with `categoryorder`.\n", 3513 | " categoryarraysrc\n", 3514 | " Sets the source reference on Chart Studio Cloud for\n", 3515 | " categoryarray .\n", 3516 | " categoryorder\n", 3517 | " Specifies the ordering logic for the case of\n", 3518 | " categorical variables. By default, plotly uses \"trace\",\n", 3519 | " which specifies the order that is present in the data\n", 3520 | " supplied. Set `categoryorder` to *category ascending*\n", 3521 | " or *category descending* if order should be determined\n", 3522 | " by the alphanumerical order of the category names. Set\n", 3523 | " `categoryorder` to \"array\" to derive the ordering from\n", 3524 | " the attribute `categoryarray`. If a category is not\n", 3525 | " found in the `categoryarray` array, the sorting\n", 3526 | " behavior for that attribute will be identical to the\n", 3527 | " \"trace\" mode. The unspecified categories will follow\n", 3528 | " the categories in `categoryarray`. Set `categoryorder`\n", 3529 | " to *total ascending* or *total descending* if order\n", 3530 | " should be determined by the numerical order of the\n", 3531 | " values. Similarly, the order can be determined by the\n", 3532 | " min, max, sum, mean or median of all the values.\n", 3533 | " color\n", 3534 | " Sets default for all colors associated with this axis\n", 3535 | " all at once: line, font, tick, and grid colors. Grid\n", 3536 | " color is lightened by blending this with the plot\n", 3537 | " background Individual pieces can override this.\n", 3538 | " constrain\n", 3539 | " If this axis needs to be compressed (either due to its\n", 3540 | " own `scaleanchor` and `scaleratio` or those of the\n", 3541 | " other axis), determines how that happens: by increasing\n", 3542 | " the \"range\" (default), or by decreasing the \"domain\".\n", 3543 | " constraintoward\n", 3544 | " If this axis needs to be compressed (either due to its\n", 3545 | " own `scaleanchor` and `scaleratio` or those of the\n", 3546 | " other axis), determines which direction we push the\n", 3547 | " originally specified plot area. Options are \"left\",\n", 3548 | " \"center\" (default), and \"right\" for x axes, and \"top\",\n", 3549 | " \"middle\" (default), and \"bottom\" for y axes.\n", 3550 | " dividercolor\n", 3551 | " Sets the color of the dividers Only has an effect on\n", 3552 | " \"multicategory\" axes.\n", 3553 | " dividerwidth\n", 3554 | " Sets the width (in px) of the dividers Only has an\n", 3555 | " effect on \"multicategory\" axes.\n", 3556 | " domain\n", 3557 | " Sets the domain of this axis (in plot fraction).\n", 3558 | " dtick\n", 3559 | " Sets the step in-between ticks on this axis. Use with\n", 3560 | " `tick0`. Must be a positive number, or special strings\n", 3561 | " available to \"log\" and \"date\" axes. If the axis `type`\n", 3562 | " is \"log\", then ticks are set every 10^(n*dtick) where n\n", 3563 | " is the tick number. For example, to set a tick mark at\n", 3564 | " 1, 10, 100, 1000, ... set dtick to 1. To set tick marks\n", 3565 | " at 1, 100, 10000, ... set dtick to 2. To set tick marks\n", 3566 | " at 1, 5, 25, 125, 625, 3125, ... set dtick to\n", 3567 | " log_10(5), or 0.69897000433. \"log\" has several special\n", 3568 | " values; \"L\", where `f` is a positive number, gives\n", 3569 | " ticks linearly spaced in value (but not position). For\n", 3570 | " example `tick0` = 0.1, `dtick` = \"L0.5\" will put ticks\n", 3571 | " at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus\n", 3572 | " small digits between, use \"D1\" (all digits) or \"D2\"\n", 3573 | " (only 2 and 5). `tick0` is ignored for \"D1\" and \"D2\".\n", 3574 | " If the axis `type` is \"date\", then you must convert the\n", 3575 | " time to milliseconds. For example, to set the interval\n", 3576 | " between ticks to one day, set `dtick` to 86400000.0.\n", 3577 | " \"date\" also has special values \"M\" gives ticks\n", 3578 | " spaced by a number of months. `n` must be a positive\n", 3579 | " integer. To set ticks on the 15th of every third month,\n", 3580 | " set `tick0` to \"2000-01-15\" and `dtick` to \"M3\". To set\n", 3581 | " ticks every 4 years, set `dtick` to \"M48\"\n", 3582 | " exponentformat\n", 3583 | " Determines a formatting rule for the tick exponents.\n", 3584 | " For example, consider the number 1,000,000,000. If\n", 3585 | " \"none\", it appears as 1,000,000,000. If \"e\", 1e+9. If\n", 3586 | " \"E\", 1E+9. If \"power\", 1x10^9 (with 9 in a super\n", 3587 | " script). If \"SI\", 1G. If \"B\", 1B.\n", 3588 | " fixedrange\n", 3589 | " Determines whether or not this axis is zoom-able. If\n", 3590 | " true, then zoom is disabled.\n", 3591 | " gridcolor\n", 3592 | " Sets the color of the grid lines.\n", 3593 | " gridwidth\n", 3594 | " Sets the width (in px) of the grid lines.\n", 3595 | " hoverformat\n", 3596 | " Sets the hover text formatting rule using d3 formatting\n", 3597 | " mini-languages which are very similar to those in\n", 3598 | " Python. For numbers, see:\n", 3599 | " https://github.com/d3/d3-3.x-api-\n", 3600 | " reference/blob/master/Formatting.md#d3_format And for\n", 3601 | " dates see: https://github.com/d3/d3-time-\n", 3602 | " format#locale_format We add one item to d3's date\n", 3603 | " formatter: \"%{n}f\" for fractional seconds with n\n", 3604 | " digits. For example, *2016-10-13 09:15:23.456* with\n", 3605 | " tickformat \"%H~%M~%S.%2f\" would display \"09~15~23.46\"\n", 3606 | " layer\n", 3607 | " Sets the layer on which this axis is displayed. If\n", 3608 | " *above traces*, this axis is displayed above all the\n", 3609 | " subplot's traces If *below traces*, this axis is\n", 3610 | " displayed below all the subplot's traces, but above the\n", 3611 | " grid lines. Useful when used together with scatter-like\n", 3612 | " traces with `cliponaxis` set to False to show markers\n", 3613 | " and/or text nodes above this axis.\n", 3614 | " linecolor\n", 3615 | " Sets the axis line color.\n", 3616 | " linewidth\n", 3617 | " Sets the width (in px) of the axis line.\n", 3618 | " matches\n", 3619 | " If set to another axis id (e.g. `x2`, `y`), the range\n", 3620 | " of this axis will match the range of the corresponding\n", 3621 | " axis in data-coordinates space. Moreover, matching axes\n", 3622 | " share auto-range values, category lists and histogram\n", 3623 | " auto-bins. Note that setting axes simultaneously in\n", 3624 | " both a `scaleanchor` and a `matches` constraint is\n", 3625 | " currently forbidden. Moreover, note that matching axes\n", 3626 | " must have the same `type`.\n", 3627 | " minexponent\n", 3628 | " Hide SI prefix for 10^n if |n| is below this number.\n", 3629 | " This only has an effect when `tickformat` is \"SI\" or\n", 3630 | " \"B\".\n", 3631 | " mirror\n", 3632 | " Determines if the axis lines or/and ticks are mirrored\n", 3633 | " to the opposite side of the plotting area. If True, the\n", 3634 | " axis lines are mirrored. If \"ticks\", the axis lines and\n", 3635 | " ticks are mirrored. If False, mirroring is disable. If\n", 3636 | " \"all\", axis lines are mirrored on all shared-axes\n", 3637 | " subplots. If \"allticks\", axis lines and ticks are\n", 3638 | " mirrored on all shared-axes subplots.\n", 3639 | " nticks\n", 3640 | " Specifies the maximum number of ticks for the\n", 3641 | " particular axis. The actual number of ticks will be\n", 3642 | " chosen automatically to be less than or equal to\n", 3643 | " `nticks`. Has an effect only if `tickmode` is set to\n", 3644 | " \"auto\".\n", 3645 | " overlaying\n", 3646 | " If set a same-letter axis id, this axis is overlaid on\n", 3647 | " top of the corresponding same-letter axis, with traces\n", 3648 | " and axes visible for both axes. If False, this axis\n", 3649 | " does not overlay any same-letter axes. In this case,\n", 3650 | " for axes with overlapping domains only the highest-\n", 3651 | " numbered axis will be visible.\n", 3652 | " position\n", 3653 | " Sets the position of this axis in the plotting space\n", 3654 | " (in normalized coordinates). Only has an effect if\n", 3655 | " `anchor` is set to \"free\".\n", 3656 | " range\n", 3657 | " Sets the range of this axis. If the axis `type` is\n", 3658 | " \"log\", then you must take the log of your desired range\n", 3659 | " (e.g. to set the range from 1 to 100, set the range\n", 3660 | " from 0 to 2). If the axis `type` is \"date\", it should\n", 3661 | " be date strings, like date data, though Date objects\n", 3662 | " and unix milliseconds will be accepted and converted to\n", 3663 | " strings. If the axis `type` is \"category\", it should be\n", 3664 | " numbers, using the scale where each category is\n", 3665 | " assigned a serial number from zero in the order it\n", 3666 | " appears.\n", 3667 | " rangebreaks\n", 3668 | " A tuple of\n", 3669 | " :class:`plotly.graph_objects.layout.yaxis.Rangebreak`\n", 3670 | " instances or dicts with compatible properties\n", 3671 | " rangebreakdefaults\n", 3672 | " When used in a template (as\n", 3673 | " layout.template.layout.yaxis.rangebreakdefaults), sets\n", 3674 | " the default property values to use for elements of\n", 3675 | " layout.yaxis.rangebreaks\n", 3676 | " rangemode\n", 3677 | " If \"normal\", the range is computed in relation to the\n", 3678 | " extrema of the input data. If *tozero*`, the range\n", 3679 | " extends to 0, regardless of the input data If\n", 3680 | " \"nonnegative\", the range is non-negative, regardless of\n", 3681 | " the input data. Applies only to linear axes.\n", 3682 | " scaleanchor\n", 3683 | " If set to another axis id (e.g. `x2`, `y`), the range\n", 3684 | " of this axis changes together with the range of the\n", 3685 | " corresponding axis such that the scale of pixels per\n", 3686 | " unit is in a constant ratio. Both axes are still\n", 3687 | " zoomable, but when you zoom one, the other will zoom\n", 3688 | " the same amount, keeping a fixed midpoint. `constrain`\n", 3689 | " and `constraintoward` determine how we enforce the\n", 3690 | " constraint. You can chain these, ie `yaxis:\n", 3691 | " {scaleanchor: *x*}, xaxis2: {scaleanchor: *y*}` but you\n", 3692 | " can only link axes of the same `type`. The linked axis\n", 3693 | " can have the opposite letter (to constrain the aspect\n", 3694 | " ratio) or the same letter (to match scales across\n", 3695 | " subplots). Loops (`yaxis: {scaleanchor: *x*}, xaxis:\n", 3696 | " {scaleanchor: *y*}` or longer) are redundant and the\n", 3697 | " last constraint encountered will be ignored to avoid\n", 3698 | " possible inconsistent constraints via `scaleratio`.\n", 3699 | " Note that setting axes simultaneously in both a\n", 3700 | " `scaleanchor` and a `matches` constraint is currently\n", 3701 | " forbidden.\n", 3702 | " scaleratio\n", 3703 | " If this axis is linked to another by `scaleanchor`,\n", 3704 | " this determines the pixel to unit scale ratio. For\n", 3705 | " example, if this value is 10, then every unit on this\n", 3706 | " axis spans 10 times the number of pixels as a unit on\n", 3707 | " the linked axis. Use this for example to create an\n", 3708 | " elevation profile where the vertical scale is\n", 3709 | " exaggerated a fixed amount with respect to the\n", 3710 | " horizontal.\n", 3711 | " separatethousands\n", 3712 | " If \"true\", even 4-digit integers are separated\n", 3713 | " showdividers\n", 3714 | " Determines whether or not a dividers are drawn between\n", 3715 | " the category levels of this axis. Only has an effect on\n", 3716 | " \"multicategory\" axes.\n", 3717 | " showexponent\n", 3718 | " If \"all\", all exponents are shown besides their\n", 3719 | " significands. If \"first\", only the exponent of the\n", 3720 | " first tick is shown. If \"last\", only the exponent of\n", 3721 | " the last tick is shown. If \"none\", no exponents appear.\n", 3722 | " showgrid\n", 3723 | " Determines whether or not grid lines are drawn. If\n", 3724 | " True, the grid lines are drawn at every tick mark.\n", 3725 | " showline\n", 3726 | " Determines whether or not a line bounding this axis is\n", 3727 | " drawn.\n", 3728 | " showspikes\n", 3729 | " Determines whether or not spikes (aka droplines) are\n", 3730 | " drawn for this axis. Note: This only takes affect when\n", 3731 | " hovermode = closest\n", 3732 | " showticklabels\n", 3733 | " Determines whether or not the tick labels are drawn.\n", 3734 | " showtickprefix\n", 3735 | " If \"all\", all tick labels are displayed with a prefix.\n", 3736 | " If \"first\", only the first tick is displayed with a\n", 3737 | " prefix. If \"last\", only the last tick is displayed with\n", 3738 | " a suffix. If \"none\", tick prefixes are hidden.\n", 3739 | " showticksuffix\n", 3740 | " Same as `showtickprefix` but for tick suffixes.\n", 3741 | " side\n", 3742 | " Determines whether a x (y) axis is positioned at the\n", 3743 | " \"bottom\" (\"left\") or \"top\" (\"right\") of the plotting\n", 3744 | " area.\n", 3745 | " spikecolor\n", 3746 | " Sets the spike color. If undefined, will use the series\n", 3747 | " color\n", 3748 | " spikedash\n", 3749 | " Sets the dash style of lines. Set to a dash type string\n", 3750 | " (\"solid\", \"dot\", \"dash\", \"longdash\", \"dashdot\", or\n", 3751 | " \"longdashdot\") or a dash length list in px (eg\n", 3752 | " \"5px,10px,2px,2px\").\n", 3753 | " spikemode\n", 3754 | " Determines the drawing mode for the spike line If\n", 3755 | " \"toaxis\", the line is drawn from the data point to the\n", 3756 | " axis the series is plotted on. If \"across\", the line\n", 3757 | " is drawn across the entire plot area, and supercedes\n", 3758 | " \"toaxis\". If \"marker\", then a marker dot is drawn on\n", 3759 | " the axis the series is plotted on\n", 3760 | " spikesnap\n", 3761 | " Determines whether spikelines are stuck to the cursor\n", 3762 | " or to the closest datapoints.\n", 3763 | " spikethickness\n", 3764 | " Sets the width (in px) of the zero line.\n", 3765 | " tick0\n", 3766 | " Sets the placement of the first tick on this axis. Use\n", 3767 | " with `dtick`. If the axis `type` is \"log\", then you\n", 3768 | " must take the log of your starting tick (e.g. to set\n", 3769 | " the starting tick to 100, set the `tick0` to 2) except\n", 3770 | " when `dtick`=*L* (see `dtick` for more info). If the\n", 3771 | " axis `type` is \"date\", it should be a date string, like\n", 3772 | " date data. If the axis `type` is \"category\", it should\n", 3773 | " be a number, using the scale where each category is\n", 3774 | " assigned a serial number from zero in the order it\n", 3775 | " appears.\n", 3776 | " tickangle\n", 3777 | " Sets the angle of the tick labels with respect to the\n", 3778 | " horizontal. For example, a `tickangle` of -90 draws the\n", 3779 | " tick labels vertically.\n", 3780 | " tickcolor\n", 3781 | " Sets the tick color.\n", 3782 | " tickfont\n", 3783 | " Sets the tick font.\n", 3784 | " tickformat\n", 3785 | " Sets the tick label formatting rule using d3 formatting\n", 3786 | " mini-languages which are very similar to those in\n", 3787 | " Python. For numbers, see:\n", 3788 | " https://github.com/d3/d3-3.x-api-\n", 3789 | " reference/blob/master/Formatting.md#d3_format And for\n", 3790 | " dates see: https://github.com/d3/d3-time-\n", 3791 | " format#locale_format We add one item to d3's date\n", 3792 | " formatter: \"%{n}f\" for fractional seconds with n\n", 3793 | " digits. For example, *2016-10-13 09:15:23.456* with\n", 3794 | " tickformat \"%H~%M~%S.%2f\" would display \"09~15~23.46\"\n", 3795 | " tickformatstops\n", 3796 | " A tuple of :class:`plotly.graph_objects.layout.yaxis.Ti\n", 3797 | " ckformatstop` instances or dicts with compatible\n", 3798 | " properties\n", 3799 | " tickformatstopdefaults\n", 3800 | " When used in a template (as\n", 3801 | " layout.template.layout.yaxis.tickformatstopdefaults),\n", 3802 | " sets the default property values to use for elements of\n", 3803 | " layout.yaxis.tickformatstops\n", 3804 | " ticklabelmode\n", 3805 | " Determines where tick labels are drawn with respect to\n", 3806 | " their corresponding ticks and grid lines. Only has an\n", 3807 | " effect for axes of `type` \"date\" When set to \"period\",\n", 3808 | " tick labels are drawn in the middle of the period\n", 3809 | " between ticks.\n", 3810 | " ticklen\n", 3811 | " Sets the tick length (in px).\n", 3812 | " tickmode\n", 3813 | " Sets the tick mode for this axis. If \"auto\", the number\n", 3814 | " of ticks is set via `nticks`. If \"linear\", the\n", 3815 | " placement of the ticks is determined by a starting\n", 3816 | " position `tick0` and a tick step `dtick` (\"linear\" is\n", 3817 | " the default value if `tick0` and `dtick` are provided).\n", 3818 | " If \"array\", the placement of the ticks is set via\n", 3819 | " `tickvals` and the tick text is `ticktext`. (\"array\" is\n", 3820 | " the default value if `tickvals` is provided).\n", 3821 | " tickprefix\n", 3822 | " Sets a tick label prefix.\n", 3823 | " ticks\n", 3824 | " Determines whether ticks are drawn or not. If \"\", this\n", 3825 | " axis' ticks are not drawn. If \"outside\" (\"inside\"),\n", 3826 | " this axis' are drawn outside (inside) the axis lines.\n", 3827 | " tickson\n", 3828 | " Determines where ticks and grid lines are drawn with\n", 3829 | " respect to their corresponding tick labels. Only has an\n", 3830 | " effect for axes of `type` \"category\" or\n", 3831 | " \"multicategory\". When set to \"boundaries\", ticks and\n", 3832 | " grid lines are drawn half a category to the left/bottom\n", 3833 | " of labels.\n", 3834 | " ticksuffix\n", 3835 | " Sets a tick label suffix.\n", 3836 | " ticktext\n", 3837 | " Sets the text displayed at the ticks position via\n", 3838 | " `tickvals`. Only has an effect if `tickmode` is set to\n", 3839 | " \"array\". Used with `tickvals`.\n", 3840 | " ticktextsrc\n", 3841 | " Sets the source reference on Chart Studio Cloud for\n", 3842 | " ticktext .\n", 3843 | " tickvals\n", 3844 | " Sets the values at which ticks on this axis appear.\n", 3845 | " Only has an effect if `tickmode` is set to \"array\".\n", 3846 | " Used with `ticktext`.\n", 3847 | " tickvalssrc\n", 3848 | " Sets the source reference on Chart Studio Cloud for\n", 3849 | " tickvals .\n", 3850 | " tickwidth\n", 3851 | " Sets the tick width (in px).\n", 3852 | " title\n", 3853 | " :class:`plotly.graph_objects.layout.yaxis.Title`\n", 3854 | " instance or dict with compatible properties\n", 3855 | " titlefont\n", 3856 | " Deprecated: Please use layout.yaxis.title.font instead.\n", 3857 | " Sets this axis' title font. Note that the title's font\n", 3858 | " used to be customized by the now deprecated `titlefont`\n", 3859 | " attribute.\n", 3860 | " type\n", 3861 | " Sets the axis type. By default, plotly attempts to\n", 3862 | " determined the axis type by looking into the data of\n", 3863 | " the traces that referenced the axis in question.\n", 3864 | " uirevision\n", 3865 | " Controls persistence of user-driven changes in axis\n", 3866 | " `range`, `autorange`, and `title` if in `editable:\n", 3867 | " true` configuration. Defaults to `layout.uirevision`.\n", 3868 | " visible\n", 3869 | " A single toggle to hide the axis while preserving\n", 3870 | " interaction like dragging. Default is true when a\n", 3871 | " cheater plot is present on the axis, otherwise false\n", 3872 | " zeroline\n", 3873 | " Determines whether or not a line is drawn at along the\n", 3874 | " 0 value of this axis. If True, the zero line is drawn\n", 3875 | " on top of the grid lines.\n", 3876 | " zerolinecolor\n", 3877 | " Sets the line color of the zero line.\n", 3878 | " zerolinewidth\n", 3879 | " Sets the width (in px) of the zero line.\n", 3880 | " " 3881 | ] 3882 | } 3883 | ], 3884 | "metadata": { 3885 | "kernelspec": { 3886 | "display_name": "Python 3", 3887 | "language": "python", 3888 | "name": "python3" 3889 | }, 3890 | "language_info": { 3891 | "codemirror_mode": { 3892 | "name": "ipython", 3893 | "version": 3 3894 | }, 3895 | "file_extension": ".py", 3896 | "mimetype": "text/x-python", 3897 | "name": "python", 3898 | "nbconvert_exporter": "python", 3899 | "pygments_lexer": "ipython3", 3900 | "version": "3.8.3" 3901 | } 3902 | }, 3903 | "nbformat": 4, 3904 | "nbformat_minor": 4 3905 | } 3906 | -------------------------------------------------------------------------------- /gantt_chart_new.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxwellbade/plotly_gantt_chart/cba58efb5206377cec592ac121361f52b50e0120/gantt_chart_new.csv --------------------------------------------------------------------------------