Display label on gnuplot value in heatmap - matrix

Base on gnuplot example about "Heat map with non-zero pixel values written as labels" in here:
http://gnuplot.sourceforge.net/demo_cvs/heatmaps.html
I have data:
6 5 4 3 1 0
3 2 2 0 0 1
0 0 0 0 1 0
0 0 0 0 2 3
0 0 1 2 4 4
0 1 2 3 4 6
and my gnuplot:
set terminal pngcairo enhanced font "arial,10" fontscale 1.0 size 500, 350
set output 'heatmaps.png'
unset key
set view map
set xtics border in scale 0,0 mirror norotate offset character 0, 0, 0 autojustify
set ytics border in scale 0,0 mirror norotate offset character 0, 0, 0 autojustify
set ztics border in scale 0,0 nomirror norotate offset character 0, 0, 0 autojustify
set nocbtics
set rtics axis in scale 0,0 nomirror norotate offset character 0, 0, 0 autojustify
set xrange [ -0.500000 : 4.50000 ] noreverse nowriteback
set yrange [ -0.500000 : 4.50000 ] noreverse nowriteback
set cbrange [ 0.00000 : 5.00000 ] noreverse nowriteback
set palette rgbformulae -7, 2, -7
splot 'heatmap.txt' matrix using 1:2:3 with image, \
'heatmap.txt' matrix using 1:2:($3 == 0 ? " " : sprintf("$3") ) with labels
this script just printout "3" in every labels. Could you help me? thanks
and also label for Xtics and Ytics
Tipe1 Tipe2 Tipe3 Tipe4 Tipe5
Failure1 6 2 0 0 1
Failure2 0 0 0 1 0
Failure3 0 0 0 2 3
Failure4 0 1 2 4 4
Failure5 1 2 3 4 6
Thanks again

I think the problem is the wrong call to the sprintf function.
sprintf(format,values)
You should call sprintf with a decimal number in format (%d) and the label value you want to display (third column $3) :
sprintf("%d",$3)
I copied your data into a file (named data) and this example works well :
plot 'data' matrix using 1:2:3 with image, '' matrix using 1:2:($3==0 ? " " : sprintf("%d",$3)) with labels
Hope it helps!

Related

xtic text has gaps. How can I adjust the terminal svg font to avoid this?

Below is the script used to generate the plot. What should I change to fix the spacing of the xtic text? I have macOS Catalina.#theozh
#/Users/CourtneyBrea/Desktop/ORR-Figures/free-energy-diagram
myFileIn(i) = sprintf("step-%d.dat",i)
myFileOut(i) = sprintf("step-%d.svg",i)
set term svg font "{/:Bold}Sans,22"
set border 15 front lt black linewidth 3.000 dashtype solid
set xlabel "Reaction Coordinate"
set xrange [-0.2:5.2]
set xtics nomirror scale 0
set ylabel "Free Energy (eV)"
set yrange[-5:0.1]
set ytics out nomirror
set key noautotitle samplen 2
set errorbars 0
dx = 0.2
do for [i=1:30] {
set output myFileOut(i)
plot myFileIn(i) u 0:2:(dx):xtic(1) w xerr lc "blue" lw 3 ps 0 ti columnheader(2), \
'' u 0:3:(dx) w xerr lc "red" lw 3 ps 0 ti columnheader(3), \
x1=y1=NaN '' u (x0=x1,x1=$0,x0-1+dx):(y0=y1,y1=$2,y0):(1-2*dx):(y1-y0) w vec dt 4 lc "blue" nohead, \
x1=y1=NaN '' u (x0=x1,x1=$0,x0-1+dx):(y0=y1,y1=$3,y0):(1-2*dx):(y1-y0) w vec dt 4 lc "red" nohead
}
set output # close the last file
### end of script
Input file below
"Reaction Coordinate" "0 V" "0.43 V"
O_{2} 0 -3.00
O#^*_{2} -0.10 -3.67
OOH^* -1.00 -3.90
O^* -2.00 -4.00
OH^* -4.00 -4.92
H_{2}O -4.92 -4.92
I suspect the problem is that you have placed the enhanced text notation for bold text in the font name rather than placing it in the text being printed. That probably confuses the program you are using to view the resulting svg file.
The correct way is to set the terminal font as just a name and a size, and then separately add any additional markup to the text strings. Revised commands below, with a screen capture of the svg file as viewed in firefox.
Note that I have applied the bold attribute only to the tic labels, because that is the tricky part. You can apply to other labels or text as you like.
set term svg font "Sans,22"
set output "gap.svg"
makebold(text) = sprintf("{/:Bold %s}", text)
set border 15 front lt black linewidth 3.000 dashtype solid
set xlabel "Reaction Coordinate"
set xrange [-0.2:5.2]
set xtics nomirror scale 0
set ylabel "Free Energy (eV)"
set yrange[-5:0.1]
set ytics out nomirror
set key noautotitle samplen 2
set errorbars 0
dx = 0.2
plot "gap.dat" u 0:2:(dx):xtic(makebold(strcol(1))) w xerr lc "blue" lw 3 ps 0 ti columnheader(2), \
'' u 0:3:(dx) w xerr lc "red" lw 3 ps 0 ti columnheader(3), \
x1=y1=NaN '' u (x0=x1,x1=$0,x0-1+dx):(y0=y1,y1=$2,y0):(1-2*dx):(y1-y0) w vec dt 4 lc "blue" nohead, \
x1=y1=NaN '' u (x0=x1,x1=$0,x0-1+dx):(y0=y1,y1=$3,y0):(1-2*dx):(y1-y0) w vec dt 4 lc "red" nohead

gnuplot errors: " line 114: warning: Skipping data file with no valid points", " line 114: all points y value undefined!". "Cannot find or open file"

Here's the image of my data file:
EPAM_2000_160.txt
When I run it through the cmd prompt, it gives an error: "Cannot find or open file "EPAM_2000_160.txt", No data in plot".
Both these files are present in the same folder in documents. I can't understand why is it unable to find.
Here's the code of the .plt file:
#set terminal x11
#set output
unset clip points
set clip one
unset clip two
set bar 1.000000
set border 31 lt -1 lw 1.000
set xdata time
set ydata time
set zdata time
set x2data time
set y2data time
set cbdata time
set timefmt "%d/%m/%y,%H:%M"
set timefmt "%d/%m/%y,%H:%M"
set timefmt "%d/%m/%y,%H:%M"
set timefmt "%d/%m/%y,%H:%M"
set timefmt "%d/%m/%y,%H:%M"
set timefmt "%d/%m/%y,%H:%M"
set boxwidth
set style fill empty border
set dummy x,y
set format x "% g"
set format y "% g"
set format x2 "% g"
set format y2 "% g"
set format z "% g"
set format cb "% g"
set angles radians
unset grid
set key title ""
set key right top Right noreverse enhanced box linetype -2 linewidth 1.000 samplen 4 spacing 1 width 0 height 0 autotitles
unset label
unset arrow
unset style line
unset style arrow
unset logscale
set offsets 0, 0, 0, 0
set pointsize 1
set encoding default
unset polar
unset parametric
unset decimalsign
set view 60, 30, 1, 1
set samples 100, 100
set isosamples 10, 10
set surface
unset contour
set clabel '%8.3g'
set mapping cartesian
set datafile separator whitespace
unset hidden3d
set cntrparam order 4
set cntrparam linear
set cntrparam levels auto 5
set cntrparam points 5
set size ratio 0 1,1
set origin 0,0
set style data points
set style function lines
set xzeroaxis lt -2 lw 1.000
set yzeroaxis lt -2 lw 1.000
set x2zeroaxis lt -2 lw 1.000
set y2zeroaxis lt -2 lw 1.000
set tics in
set ticslevel 0.5
set tics scale 1
set mxtics default
set mytics default
set mztics default
set mx2tics default
set my2tics default
set mcbtics default
set xtics border mirror norotate autofreq
set ytics border mirror norotate autofreq
set ztics border nomirror norotate autofreq
set nox2tics
set noy2tics
set cbtics border mirror norotate autofreq
set title "" offset 0.000000,0.000000 font ""
set timestamp "" bottom norotate offset 0.000000,0.000000 font ""
set rrange [ * : * ] noreverse nowriteback # (currently [0.00000:10.0000] )
set trange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] )
set urange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] )
set vrange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] )
set xlabel "DOY 2000" offset 0.000000,0.000000 font ""
set x2label "" offset 0.000000,0.000000 font ""
set xrange [ 160.3 : 160.44 ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set x2range [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set ylabel "Ion intensity Sector Avg,1/(cm**2-s-sr-MeV) LEMS120" offset 0.000000,0.000000 font ""
set y2label "" offset 0.000000,0.000000 font ""
set yrange [ 1. : * ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set y2range [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set zlabel "" offset 0.000000,0.000000 font ""
set zrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set cblabel "" offset 0.000000,0.000000 font ""
set cbrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] )
set zero 1e-08
set lmargin -1
set bmargin -1
set rmargin -1
set tmargin -1
set locale "C"
set pm3d scansautomatic flush begin noftriangles nohidden3d implicit corners2color mean
unset pm3d
set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB
set palette rgbformulae 7, 5, 15
set colorbox default
set colorbox vertical origin 0.9,0.2 size 0.1,0.63 bdefault
set loadpath
set fontpath
set fit noerrorvariables
set arrow from 160.36,1. to 160.36,700000 nohead
plot 'EPAM_2000_160.txt' u 1:2 t '0.047-0.068 MeV'
set term post colour eps enh
set output "EPAM_2000_160.eps"
replot
set output
set term x11
# EOF
If you open the file with an absolute link, make sure to double each backslash as backslash needs escaping in C/C++ strings.
Otherwise make sure the relative path to the file is correct for the current path from where the application is started.
Thank you so much! Though I believe something is wrong with the .plt file itself. Because I was able to plot just the text file without going through the .plt file. And I have saved that as a new .plt file. So i'll just add the old commands one by one and figure out what messed up ig.
Here is the code for the new .plt file:
# set terminal windows 0 color solid butt enhanced standalone
# set output
unset clip points
set clip one
unset clip two
set errorbars front 1.000000
set border 31 front lt black linewidth 1.000 dashtype solid
set zdata
set ydata
set xdata
set y2data
set x2data
set boxwidth
set style fill empty border
set style rectangle back fc bgnd fillstyle solid 1.00 border lt -1
set style circle radius graph 0.02
set style ellipse size graph 0.05, 0.03 angle 0 units xy
set dummy x, y
set format x "% h"
set format y "% h"
set format x2 "% h"
set format y2 "% h"
set format z "% h"
set format cb "% h"
set format r "% h"
set ttics format "% h"
set timefmt "%d/%m/%y,%H:%M"
set angles radians
set tics back
unset grid
unset raxis
set theta counterclockwise right
set style parallel front lt black linewidth 2.000 dashtype solid
set key title "" center
set key fixed right top vertical Right noreverse enhanced autotitle nobox
set key noinvert samplen 4 spacing 1 width 0 height 0
set key maxcolumns 0 maxrows 0
set key noopaque
unset label
unset arrow
set style increment default
unset style line
unset style arrow
set style histogram clustered gap 2 title textcolor lt -1
unset object
set style textbox transparent margins 1.0, 1.0 border lt -1 linewidth 1.0
set offsets 0, 0, 0, 0
set pointsize 1
set pointintervalbox 1
set encoding cp1252
unset polar
unset parametric
unset decimalsign
unset micro
unset minussign
set view 60, 30, 1, 1
set view azimuth 0
set rgbmax 255
set samples 100, 100
set isosamples 10, 10
set surface
unset contour
set cntrlabel format '%8.3g' font '' start 5 interval 20
set mapping cartesian
set datafile separator whitespace
unset hidden3d
set cntrparam order 4
set cntrparam linear
set cntrparam levels 5
set cntrparam levels auto
set cntrparam firstlinetype 0 unsorted
set cntrparam points 5
set size ratio 0 1,1
set origin 0,0
set style data points
set style function lines
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
unset x2zeroaxis
unset y2zeroaxis
set xyplane relative 0.5
set tics scale 1, 0.5, 1, 1, 1
set mxtics default
set mytics default
set mztics default
set mx2tics default
set my2tics default
set mcbtics default
set mrtics default
set nomttics
set xtics border in scale 1,0.5 mirror norotate autojustify
set xtics norangelimit autofreq
set ytics border in scale 1,0.5 mirror norotate autojustify
set ytics norangelimit autofreq
set ztics border in scale 1,0.5 nomirror norotate autojustify
set ztics norangelimit autofreq
unset x2tics
unset y2tics
set cbtics border in scale 1,0.5 mirror norotate autojustify
set cbtics norangelimit autofreq
set rtics axis in scale 1,0.5 nomirror norotate autojustify
set rtics norangelimit autofreq
unset ttics
set title ""
set title font "" textcolor lt -1 norotate
set timestamp bottom
set timestamp ""
set timestamp font "" textcolor lt -1 norotate
set trange [ * : * ] noreverse nowriteback
set urange [ * : * ] noreverse nowriteback
set vrange [ * : * ] noreverse nowriteback
set xlabel ""
set xlabel font "" textcolor lt -1 norotate
set x2label ""
set x2label font "" textcolor lt -1 norotate
set xrange [ * : * ] noreverse writeback
set x2range [ * : * ] noreverse writeback
set ylabel ""
set ylabel font "" textcolor lt -1 rotate
set y2label ""
set y2label font "" textcolor lt -1 rotate
set yrange [ * : * ] noreverse writeback
set y2range [ * : * ] noreverse writeback
set zlabel ""
set zlabel font "" textcolor lt -1 norotate
set zrange [ * : * ] noreverse writeback
set cblabel ""
set cblabel font "" textcolor lt -1 rotate
set cbrange [ * : * ] noreverse writeback
set rlabel ""
set rlabel font "" textcolor lt -1 norotate
set rrange [ * : * ] noreverse writeback
unset logscale
unset jitter
set zero 1e-08
set lmargin -1
set bmargin -1
set rmargin -1
set tmargin -1
set locale "English_India.1252"
set pm3d explicit at s
set pm3d scansautomatic
set pm3d interpolate 1,1 flush begin noftriangles noborder corners2color mean
set pm3d nolighting
set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB
set palette rgbformulae 7, 5, 15
set colorbox default
set colorbox vertical origin screen 0.9, 0.2 size screen 0.05, 0.6 front noinvert bdefault
set style boxplot candles range 1.50 outliers pt 7 separation 1 labels auto unsorted
set loadpath
set fontpath
set psdir
set fit brief errorvariables nocovariancevariables errorscaling prescale nowrap v5
GNUTERM = "windows"
## Last datafile plotted: "EPAM_2000_160_CUT.txt"
plot "EPAM_2000_160_CUT.txt" u 1:2 t '0.047-0.068 MeV' , "EPAM_2000_160_CUT.txt" u 1:3 t'0.068-0.115 MeV' , "EPAM_2000_160_CUT.txt" u 1:4 t'0.115-0.195 MeV' , "EPAM_2000_160_CUT.txt" u 1:5 t'0.195-0.321 MeV'
# EOF

rotate() in Eigen::Transform is not transforming my rotation matrix

I have defined a rotation matrix and wanted the Eigen::Transform to perform rotation. For some reason, it is still set at identity although I am rotating it.
//Definig my rotation matrix
Eigen::Matrix3f roll_rotation_matrix( 3, 3 );
roll_rotation_matrix << 1, 0, 0, 0, 0, 1, 0, -1, 0;
//Print
display("PRINT ROLL ROTATION: ")
display(roll_rotation_matrix)
// Perform rotation along X
display("BEFORE: ")
display(roll_input_stamped_transform.transform.rotation())
//Rotate the rotation matrix
roll_input_stamped_transform.transform.rotate( roll_rotation_matrix );
roll_input_stamped_transform.transform.rotation = roll_rotation_matrix;
//Print
display(" AFTER: ")
display(roll_input_stamped_transform.transform.rotation());
And my output here is as below:
PRINT ROLL ROTATION:
1 0 0
0 0 1
0 -1 0
BEFORE:
1 0 0
0 1 0
0 0 1
AFTER:
1 0 0
0 1 0
0 0 1
As I am printing my roll_rotation_matrix, I can see that my matrix is not identity. But, even after applying rotate(), the rotation matrix still seems to be at identity.
Do you guys have any clue as to what might me going on here?
Figured out the issue.
I had to set the roll_input_stamped_transform.transform.setIdentity() in order for it to apply my rotation matrix.

gnuplot label specific y data point with x value

How can I label a datapoint on a specific y value with its corresponding x value? Extra difficulty is the x values should be in hours and not date.
I have this data:
data.csv:
2019-01-04-11:02:24,1.468
2019-01-04-12:40:54,1.212
2019-01-04-15:16:22,1.123
2019-01-04-17:04:43,1.067
2019-01-04-18:51:45,0.994
2019-01-04-19:51:21,0.919
2019-01-04-20:46:40,0.8
I plot it with:
set datafile separator ","
set terminal png size 600,300 enhanced font 'Verdana,10' linewidth 1
set output 'data.png'
set xdata time
MyTimeFormat = "%Y-%m-%d-%H:%M:%S"
set timefmt MyTimeFormat
set format x "%tH"
set xlabel "hours"
set ylabel "Volt"
set grid ytics xtics mxtics
StartTime = strptime(MyTimeFormat,"2019-01-04-11:01:31")
EndTime = strptime(MyTimeFormat,"2019-01-04-20:47:17")
plot 'data.csv' u (timecolumn(1)-StartTime):2 w lines lw 1 notitle,\
'' u (timecolumn(1)-StartTime):2:1 w labels notitle
That gives this plot:
Lets assume I am interested in displaying a single y value 0.89. How can I label the intersection on the plot with the corresponding x value in hours, like in this plot:
I know the problem is that point does not exist in my data but is this possible anyway? If not, how to do it with an existing y value near the desired value for example this value:
2019-01-04-19:51:21,0.919
Check the following. The ternary operator helps you here.
The label of the first value which is below a certain threshold is plotted as label.
Of course, it would be nicer interpolate the value at the threshold, which also can be done but requires some more coding.
### threshold value as label
reset session
$Data <<EOD
2019-01-04-11:02:24,1.468
2019-01-04-12:40:54,1.212
2019-01-04-15:16:22,1.123
2019-01-04-17:04:43,1.067
2019-01-04-18:51:45,0.994
2019-01-04-19:51:21,0.919
2019-01-04-20:46:40,0.8
EOD
set datafile separator ","
#set terminal png size 600,300 enhanced font 'Verdana,10' linewidth 1
#set output 'data.png'
set xdata time
MyTimeFormat = "%Y-%m-%d-%H:%M:%S"
set timefmt MyTimeFormat
set format x "%tH"
set xlabel "hours"
set ylabel "Volt"
set grid ytics xtics mxtics
StartTime = strptime(MyTimeFormat,"2019-01-04-11:01:31")
EndTime = strptime(MyTimeFormat,"2019-01-04-20:47:17")
set multiplot layout 2,1
OffsetY = 0.1
plot $Data u (timecolumn(1)-StartTime):2 w lp lt 7 lc rgb "red" notitle,\
'' u (timecolumn(1)-StartTime):($2+OffsetY):(sprintf("%.2f",(timecolumn(1)-StartTime)/3600)) w labels notitle
Threshold = 1.1
a = NaN
Flag = 1
plot $Data u (timecolumn(1)-StartTime):2 w lp lt 7 lc rgb "blue" notitle,\
'' u (a = timecolumn(1)-StartTime):\
($2+OffsetY):\
(($2<Threshold) & (Flag==1) ? (Flag=0, sprintf("%.2f|%g",a/3600,Threshold)) : "") w labels notitle
unset multiplot
### end of code
Which results in:
Addition:
Another improved bit more complex solution finds the point of interest (POI) in a first pass, interpolates and finally adds lines and labels.
### threshold value as label
reset session
$Data <<EOD
2019-01-04-11:02:24,1.468
2019-01-04-12:40:54,1.212
2019-01-04-15:16:22,1.123
2019-01-04-17:04:43,1.067
2019-01-04-18:51:45,0.994
2019-01-04-19:51:21,0.919
2019-01-04-20:46:40,0.8
EOD
set datafile separator ","
# set terminal png size 600,300 enhanced font 'Verdana,10' linewidth 1
# set output 'data.png'
set xdata time
MyTimeFormat = "%Y-%m-%d-%H:%M:%S"
set timefmt MyTimeFormat
set format x "%tH:%tM"
set xlabel "hours"
set ylabel "Volt"
set grid ytics xtics mxtics
# settings
Threshold = 0.89
LabelOffsetY = 0.1
Flag = 0
LastX = LastY = TempX = TempY = POIx = NaN
# formula for interpolation and finding the threshold x value
Interpolate(x0,y0,x1,y1,xi) = y0 + (y1-y0)/(x1-x0)*(xi-x0)
ThresholdX(X,Y) = ((LastY>=Threshold) & (Y<Threshold) & (Flag==0)) ? \
(Flag=1, POIx = Interpolate(LastY,LastX,Y,X,Threshold)) : NaN
set table $Dummy
plot $Data u ($0 == 0 ? (StartTime = timecolumn(1), 0) : LastX = TempX, TempX = timecolumn(1)-StartTime, LastY = TempY, TempY = $2, ThresholdX(TempX,TempY)):\
(TempY) w table
unset table
# lines and label
set arrow 1 from graph 0, first Threshold to POIx,Threshold lc rgb "red" nohead
set arrow 2 from POIx,graph 0 to POIx,Threshold lc rgb "red" nohead
set arrow 3 from POIx,Threshold+LabelOffsetY*0.8 to POIx,Threshold lc rgb "black" lw 1.5
set style textbox opaque
set label 1 at POIx,Threshold+LabelOffsetY sprintf("%.2f/%.2f", POIx/3600, Threshold) boxed front
# plotting data
plot $Data u (timecolumn(1)-StartTime):2 w lp lt 7 lc rgb "blue" notitle
### end of code

Why I cannot control intensity of color's components in imshow?

I have the following code:
red = [1 255 0; 0 0 0; 0 0 0];
green = [0 0 0; 0 0 0; 0 0 0];
blue = [0 0 0; 0 0 0; 0 0 0];
figure,imshow(cat(3,red,green,blue))
According to my "intuitive" understanding the color of the first pixel of the image should have the following rgb components: (1,0,0), while the second pixel should have the following components: (255,0,0) (when I say the "first" and "second" I mean the text order: from left to right, from top to bottom).
In other words the first pixel should be almost absolutely black while the second one should be red. However, the both pixels look perfectly red. What am I missing here?
I'm no expert, but I think it's because you're passing doubles to imshow. You could try
imshow(uint8(cat(3, red, green, blue)))

Resources