Join Virtual JavaScript Days 2026 and Get a Free Participation Certificate – Register Now!

How Technology Is Changing How We Treat D3 Heat Maps

April 12, 2022 2734 Views

Get a summary of this article:

Sencha Ext JS is a JavaScript framework for creating data-intensive, cross-platform online and mobile applications for any modern device. It gives developers access to a number of fantastic libraries. Sencha Ext JS’s D3 package has many useful components. You can use them to generate fantastic data visualizations that will help your company uncover vital business insights. In this article, we’ll look at one of the most useful native Ext JS components, the D3 heat map. We will show you how technology has made it more essential than ever.

What is the Importance of D3 in Ext JS?

A good application presents its data clearly and appealingly. D3 is a popular way of accomplishing this. Moreover, the D3 package makes integrating D3 into your Ext JS application even more straightforward than before. D3 is a JavaScript package with a lot of features. It allows you to create dynamic and interactive data visualizations using modern web standards in your web browser. SVG, HTML, and CSS are examples of these standards. D3 is also free and open-source, so you can use it without investing a dime.

What are Heatmaps?

A heatmap (or heat map) is a graphical representation of data with color-coded values. They’re crucial for determining what works and doesn’t work on a website or product page.

Heatmaps allow you to evaluate your product’s performance and increase user engagement and retention by experimenting with how particular buttons and items are placed on your website. This enables you to prioritize the tasks that will increase customer value. Heatmaps make it simple to view and understand complex data at a glance. Website and product heatmaps use a range of colors, red to blue, to depict the most popular (hot) and least popular (cold) aspects of your site’s website content.

These plots help you identify trends and optimize your product and site to increase user engagement and sales. They do this by aggregating user behavior and providing a snapshot of how your target audience interacts with an individual website or product page by combining quantitative and qualitative data.

How is D3 Heat Map Affected by the Shift in the Technological Landscape?

The ‘d3-heatmap’ component is used to display matrices with individual values expressed as colors. Ext.d3.axis is used twice in this component. You can easily visualize complex data, such as multidimensional arrays, using the Sencha Ext JS D3-heatmap component. Heatmaps are a visual representation of matrices with individual values represented as colors. Today heatmaps are very popular!

Fiddle is a web application that allows you to create, run, and share code examples using the Ext JS framework. Fiddle is compatible with the same systems and browsers as Ext JS 6.2.0. It features an online IDE and a view of your running example without the need to install anything locally.

The following code generates one of the most basic heat maps:

Ext.create('Ext.panel.Panel', {
renderTo: Ext.getBody(),
title: 'Heatmap Chart',
height: 750,
width: 750,
layout: 'fit',
items: [
{
xtype: 'd3-heatmap',
padding: {
top: 20,
right: 30,
bottom: 20,
left: 80
},

xAxis: {
axis: {
ticks: 'd3.time.days',
tickFormat: "d3.time.format('%b %d')",
orient: 'bottom'
},
scale: {
type: 'time'
},
title: {
text: 'Date'
},
field: 'date',
step: 24 * 60 * 60 * 1000
},

yAxis: {
axis: {
orient: 'left'
},
scale: {
type: 'linear'
},
title: {
text: 'Total'
},
field: 'bucket',
step: 100
},

colorAxis: {
scale: {
type: 'linear',
range: ['white', 'orange']
},
field: 'count',
minimum: 0
},

tiles: {
attr: {
'stroke': 'black',
'stroke-width': 1
}
},

store: {
fields: [
{name: 'date', type: 'date', dateFormat: 'Y-m-d'},
'bucket',
'count'
],
data: [
{ "date": "2012-07-20", "bucket": 800, "count": 119 },
{ "date": "2012-07-20", "bucket": 900, "count": 123 },
{ "date": "2012-07-20", "bucket": 1000, "count": 173 },
{ "date": "2012-07-20", "bucket": 1100, "count": 226 },
{ "date": "2012-07-20", "bucket": 1200, "count": 284 },
{ "date": "2012-07-21", "bucket": 800, "count": 123 },
{ "date": "2012-07-21", "bucket": 900, "count": 165 },
{ "date": "2012-07-21", "bucket": 1000, "count": 237 },
{ "date": "2012-07-21", "bucket": 1100, "count": 278 },
{ "date": "2012-07-21", "bucket": 1200, "count": 338 },
{ "date": "2012-07-22", "bucket": 900, "count": 154 },
{ "date": "2012-07-22", "bucket": 1000, "count": 241 },
{ "date": "2012-07-22", "bucket": 1100, "count": 246 },
{ "date": "2012-07-22", "bucket": 1200, "count": 300 },
{ "date": "2012-07-22", "bucket": 1300, "count": 305 },
{ "date": "2012-07-23", "bucket": 800, "count": 120 },
{ "date": "2012-07-23", "bucket": 900, "count": 156 },
{ "date": "2012-07-23", "bucket": 1000, "count": 209 },
{ "date": "2012-07-23", "bucket": 1100, "count": 267 },
{ "date": "2012-07-23", "bucket": 1200, "count": 299 },
{ "date": "2012-07-23", "bucket": 1300, "count": 316 },
{ "date": "2012-07-24", "bucket": 800, "count": 105 },
{ "date": "2012-07-24", "bucket": 900, "count": 156 },
{ "date": "2012-07-24", "bucket": 1000, "count": 220 },
{ "date": "2012-07-24", "bucket": 1100, "count": 255 },
{ "date": "2012-07-24", "bucket": 1200, "count": 308 },
{ "date": "2012-07-25", "bucket": 800, "count": 104 },
{ "date": "2012-07-25", "bucket": 900, "count": 191 },
{ "date": "2012-07-25", "bucket": 1000, "count": 201 },
{ "date": "2012-07-25", "bucket": 1100, "count": 238 },
{ "date": "2012-07-25", "bucket": 1200, "count": 223 },
{ "date": "2012-07-26", "bucket": 1300, "count": 132 },
{ "date": "2012-07-26", "bucket": 1400, "count": 117 },
{ "date": "2012-07-26", "bucket": 1500, "count": 124 },
{ "date": "2012-07-26", "bucket": 1600, "count": 154 },
{ "date": "2012-07-26", "bucket": 1700, "count": 167 }
]
}
}
]
});

You can even generate a slightly more complicated heatmap right now by simply clicking here. The code below generates a D3 SVG Heatmap:

Ext.define('KitchenSink.view.d3.custom.svg.DayHourHeatMap', {
extend: 'Ext.panel.Panel',
xtype: 'd3-view-day-hour-heatmap',
controller: 'day-hour-heatmap',

requires: [
'Ext.d3.svg.Svg'
],

width: 960,
height: 520,

layout: 'fit',

items: [{
xtype: 'd3',
padding: '50 0 100 30',
listeners: {
sceneresize: 'onSceneResize'
}
}]
});

Ext.define('KitchenSink.view.d3.DayHourHeatMapController', {
extend: 'Ext.app.ViewController',
alias: 'controller.day-hour-heatmap',

datasets: [
'heatmap1.tsv',
],

onDataset1: function () {
this.heatmapChart(this.datasets[0]);
},

onSceneResize: function (component, scene, size) {
var width = size.width,
height = size.height,
gridSize = Math.floor(width / 24),
legendElementWidth = gridSize * 2,
buckets = 9,
colors = ['#ffffd9','#edf8b1','#c7e9b4','#7fcdbb','#41b6c4','#1d91c0','#225ea8','#253494','#081d58'],
days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
times = ['1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12a', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p', '12p'];

scene.classed('d3-heatmap', true);

var dayLabels = scene.selectAll('.dayLabel')
.data(days)
.enter().append('text')
.text(function (d) { return d; })
.attr('x', 0)
.attr('y', function (d, i) { return i * gridSize; })
.style('text-anchor', 'end')
.attr('transform', 'translate(-6,' + gridSize / 1.5 + ')')
.attr('class', function (d, i) { return ((i >= 0 && i <= 4) ? 'dayLabel mono axis axis-workweek' : 'dayLabel mono axis'); });

var timeLabels = scene.selectAll('.timeLabel')
.data(times)
.enter().append('text')
.text(function (d) { return d; })
.attr('x', function (d, i) { return i * gridSize; })
.attr('y', 0)
.style('text-anchor', 'middle')
.attr('transform', 'translate(' + gridSize / 2 + ', -6)')
.attr('class', function (d, i) { return ((i >= 7 && i <= 16) ? 'timeLabel mono axis axis-worktime' : 'timeLabel mono axis'); });

this.heatmapChart = function (tsvFile) {
d3.tsv(tsvFile,
function (d) {
return {
day: +d.day,
hour: +d.hour,
value: +d.value
};
},
function (error, data) {
var colorScale = d3.scaleQuantile()
.domain([0, buckets - 1, d3.max(data, function (d) { return d.value; })])
.range(colors);

var cards = scene.selectAll('.hour')
.data(data, function (d) {return d.day+':'+d.hour;});

// First time we are here, the update selection will be empty.
// During subsequent calls, the enter selection will be empty.

// The exit selection is always going to be empty in this example,
// as we will be reusing elements. Still, it's a good practice
// to take care of it, just in case.
cards.exit().remove();

cards.enter().append('rect')
.attr('x', function (d) { return (d.hour - 1) * gridSize; })
.attr('y', function (d) { return (d.day - 1) * gridSize; })
.attr('rx', 4)
.attr('ry', 4)
.attr('class', 'hour bordered')
.attr('width', gridSize)
.attr('height', gridSize)
.style('fill', colors[0])
// In D3 4.x selections are now immutable (enter does not mutate update)
.merge(cards) // so we merge enter and update selections manually
.transition().duration(1000)
.style('fill', function (d) { return colorScale(d.value); });

var legend = scene.selectAll('.legend')
.data([0].concat(colorScale.quantiles()), function (d) { return d; });

legend.exit().remove();

legend = legend.enter().append('g')
.attr('class', 'legend')
.merge(legend);

legend.append('rect')
.attr('x', function (d, i) { return legendElementWidth * i; })
.attr('y', height)
.attr('width', legendElementWidth)
.attr('height', gridSize / 2)
.style('fill', function (d, i) { return colors; });

legend.append('text')
.attr('class', 'mono')
.text(function (d) { return '≥ ' + Math.round(d); })
.attr('x', function (d, i) { return legendElementWidth * i; })
.attr('y', height + gridSize);
});
};

this.heatmapChart(this.datasets[0]);
}
});

Ext.application({
name: 'MyApp',
mainView: 'KitchenSink.view.d3.custom.svg.DayHourHeatMap'
});

This code will give us the following heatmap:

Ready to start working with heat maps?

Heat maps are a wonderful way to quickly communicate project progress or demonstrate relationships between two data sets. A heat map can be used as a quick assessment tool to assist, identify, and set priorities. With the evolution of technologies and the need for better analysis, the demand for D3 heat maps has also increased. Now is the moment to start using heat mapping technology to increase your website’s aesthetic appeal and performance, whether you’re a web designer or a website owner.

Click here to access the best resource for starting with D3 heat maps.

Recommended Articles

Building Responsive, Data-Driven Enterprise Applications with JavaScript

In enterprise software, responsiveness is no longer a nice-to-have. Users expect the same application to perform smoothly whether they are working at a desktop with…

What’s New in ReExt 1.2

Modern teams are under constant pressure to ship faster without sacrificing UX quality, maintainability, or enterprise-grade capabilities. That’s easy to say, but much harder to…

BFF Architecture – Optimizing Communication between Node. js and Ext JS

Modern enterprise applications rarely struggle because they lack features. More often, they struggle because the frontend and backend are speaking slightly different languages. Your database…

Case Study: Building a Modern Recruitment Application with Ext JS

Hiring the right talent requires more than collecting resumes. Modern recruitment teams need streamlined workflows, real-time visibility, and reliable tools that support every stage of…

Techniques for Handling Large Data Sets in Ext JS

Enterprise applications often need to display and process thousands – or even millions – of records while maintaining a responsive and intuitive user experience. Whether…

Building an AI-Powered School Grading System with Ext JS

Educational institutions are under increasing pressure to evaluate growing numbers of student assessments while maintaining fairness, consistency, and timely feedback. Although artificial intelligence offers new…

View More
JS Days Popup