if i use the plotly backend to make a heatmap with a small number of categorical variables then everything is fine

```
using Plots
plotly()
categories = string.(collect('a':'e'))
n = length(categories) #5
heatmap(categories, categories, rand(n,n))
```

which is to say that the hover always shows the x and y categories and the value

But when the number of categories becomes large then the x and y axes are, very reasonably, labeled with only a subset of the categories. That’s fine, but the problem is that the hover display doesn’t show the underlying category unless it happens to be displayed along the axis:

```
categories = string.(collect('a':'z'))
n = length(categories) #26
heatmap(categories, categories, rand(n,n))
```

gives

or

**Finally, my question:** Is there a way to force the heatmap function to display the underlying categories even when the categorical values of the x and/or y coords are not displayed along the axis?

You can try this:

```
using Plots; plotly()
categories = 'a':'z'
n = length(categories) #26
t = (0.5:(n-0.5), categories)
heatmap(categories, categories, rand(n,n), ticks=t)
```

1 Like

I’d like to re-open this because I’m confused again. The solution provided for @rafael.guerra works great when the number of categories is relatively small.

But if, for example, I do

```
using Plots; plotly()
categories = collect(Iterators.flatten(('a':'z', 'A':'Z','0':'9')))
n = length(categories) #62
t = (0.5:(n-0.5), categories)
heatmap(categories, categories, rand(n,n), ticks=t)
```

then the x and y-axis tick marks become very congested.

But if I ‘thin out’ the tick marks by choosing, for example

```
indx = 1:10:length(categories)
subset_of_categories = categories[indx]
nsub = length(subset_of_categories)
t = (collect(indx) .- 0.5, subset_of_categories)
```

then the hover display only shows the category label for points that happen to have an x-value or y-value for which there’s a tickmark. Otherwise you just see a number.

MY QUESTION: Is there a “best of both worlds” choice of settings that leave the tickmarks on the axes as something reasonable (as is automatically the case when we omit the ticks argument to `heatmap`

) but still shows the x and y category labels when I hover over an arbitrary point in the heatmap(as is the case when the tickmarks include all labels)?

Try increasing the plot size by calling `heatmap()`

with the keyword argument `size=(1200,1200)`

or larger.

This was just a minimal example of the issue… In my actual use case I have a date range as the categorical variable on 1 axis and discrete numerical variable on the other axis. So there are hundreds of discrete categorical variables. Which means I can’t make my plot big enough to prevent the tick marks from being congested

I like using `heatmap`

in addition to `surface`

because the two visualization tools help me develop intuition and aid pattern recognition in *different* ways. And if I call

```
z = [sqrt(x^2 + y^2) for y in 1:n, x in 1:n]
surface(categories, categories, z, ticks=:native)
```

then all is well, i.e. the x and y axis ticks are subset reasonably AND mouseover shows the categories rather than numbers for the x and y coord of the surface plot.

But `ticks=:native`

doesn’t work with `heatmap`

:< . I don’t know why that would be, since a `heatmap`

is just a visually “flattened” version of a `surface`

plot. But, in any case, I’m simply wondering if there’s a way to get the equivalent of `ticks = :native`

behavior in `heatmap`

…

If you’re using dates, try this solution for getting `:native`

working.

No. That doesn’t deal with the problem. But thank you for trying to help. I appreciate the generosity.