The Stack Overflow podcast is back! Listen to an interview with our new CEO.

# Return to Revisions

4 of 5 Added one-dimensional heat line (PDF plot)

It seems like none of the answers I see up to now are actually producing heat maps. The difference between a heat map and a ListDensityPlot is important. In Mathematica vocabulary, the heat map is a SmoothDensityHistogram.

First of all, I tried to directly use the 'heatMap' function in my answer. I just tried it with the data in that post:

data = RandomReal[1, {100, 2}];

Show[heatMap[data, "Points" -> 300, "Radius" -> {10, .02},
PlotRange -> {{0, 1}, {0, 1}},
ColorFunction -> ColorData["Rainbow"]], Graphics[Point@data],
PlotRange -> {{0, 1}, {0, 1}}]


All I did is to specify a tuple {10, .02} for the "Radius" option. Its first entry is the radius in the vertical direction, and with a choice of 10 this smears all the data out over the entire vertical image range.

This shows it works without modifying the code. But of course I have to tweak the function in order to make it look more "one-dimensional":

heatMap[data_, opts : OptionsPattern[]] :=
Module[{n, size, xRange, pr},
n = "Points" /. {opts} /. {"Points" -> 100};
pr = PlotRange /. {opts} /. {PlotRange :>
Map[{Min[#], Max[#]} &, Transpose[data]]};
xRange = -Subtract @@ pr[[1]];
size = Floor[
n ("Radius" /. {opts} /. {"Radius" -> xRange/6})/xRange];
Graphics[
{Inset[
ArrayPlot[
Rescale@GaussianFilter[
ImageData@ColorNegate@ColorConvert[
Rasterize[
Graphics[
Point[data],
Background -> White,
PlotRangePadding -> 0,
ImagePadding -> 0,
ImageMargins -> 0,
PlotRange -> pr
],
"Image",
ImageSize -> n
],
"GrayScale"
],
{3 size, size},
Padding -> 0
],
ColorFunction -> (ColorFunction /. {opts} /. {ColorFunction ->
ColorData["LakeColors"]}),
ImagePadding -> 0,
PlotRangePadding -> 0,
Frame -> False
],
pr[[All, 1]],
{0, 0}, xRange]},
PlotRange -> pr,
Frame -> True,
FrameTicks -> {Automatic, None}
]
]


So here I removed the PlotRangePadding and the FrameTicks on the left side, as well as the PlotRangePadding. I think that's all you need to change. Having collapsed the data onto a single axis, the vertical smearing for GaussianFilter needs to be only of order 1 (in relation to the horizontal axis) - so that's what I used. Then I set the PlotRange appropriately and get this:

data = RandomReal[{0, 1}, 100];
data = {#, 0} & /@ data;

heatMap[data, "Points" -> 300, "Radius" -> {1, .02},
PlotRange -> {{0, 1}, {0, .04}}, PlotRangePadding -> 0,
FrameLabel -> None]


The meaning of the option "Points" (number of horizontal sampling points) is the same as described in the linked post.

Edit

As I mentioned, a heat map is also realizable using built-in smoothed histogram techniques. I think the easiest way to do that in the present case would be as follows:

DensityPlot[
Evaluate@PDF[SmoothKernelDistribution[data, {1, .02}], {y, x}], {x,
0, 1}, {y, 0, .2}, AspectRatio -> Automatic, PlotPoints -> {200, 2},
FrameTicks -> {Automatic, None}, PlotRangePadding -> None]


The unequal smearing is now achieved by specifying a tuple for the "bandwidth" parameter in SmoothKernelDistribution: in {1, .02}, the 1 is again chosen to be large compared to the plot range in the y direction (from 0 to .2) so that you get vertical bands. It's of also necessary to adjust the number of PlotPoints to be large enough in the horizontal direction so as to capture all the details of the distribution. The vertical number of PlotPoints (the second number in {200, 2}) can be set to the smallest possible value, 2.

Edit 2

Of course, we can also backtrack even further and go to the original data set you started with - which was purely one-dimensional. In that situation, you can simply do something like this:

data = RandomReal[1, 100];

DensityPlot[
Evaluate[{PDF[SmoothKernelDistribution[data, .02], x], 0}], {x, 0,
1}, {y, 0, .04}, AspectRatio -> Automatic, PlotPoints -> {200, 2},
FrameTicks -> {Automatic, None}, PlotRangePadding -> None]


This involves no need for smearing in the vertical direction because it calculates the density function one-dimensionally in the first place. The methods above have their justification too, when the data list does have two-dimensional points that you want to project onto a single axis.

Edit 3

I also see the question asks for a "heatline" - if I understand this as a line plot, one could get it very straightforwardly:

Plot[Evaluate@PDF[SmoothKernelDistribution[data, .02], x], {x, 0, 1}]


This is simply a plot of the one-dimensional probability density function for the data set, smoothed with bandwidth .02.

 answered Jul 11 '12 at 0:06 Jens 88.9k66 gold badges176176 silver badges412412 bronze badges