/usr/share/tcltk/tklib0.6/plotchart/plotcombined.tcl is in tklib 0.6-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | # plotcombined.tcl --
# Procedures to create combined plots/charts
#
# methods --
# Register the methods for the combined plots/charts
#
namespace eval ::Plotchart {
variable methodProc
set methodProc(tableplot,title) DrawTitle
set methodProc(tableplot,ytext) DrawYtext
set methodProc(tableplot,row) TablePlotDrawRow
set methodProc(tableplot,dataconfig) TablePlotDataConfig
}
# TableFillRow --
# Fill the row
# Arguments:
# table Table command
# widget Underlying widget
# row Row index of the cell
# column Column index of the cell
# value Value to be shown
#
proc ::Plotchart::TableFillRow {table widget row column value} {
variable data_series
if { $column == 0 } {
#
# Draw the legend entry
#
foreach {w series value} $value {break}
set coords [$table cellcoordinates]
set xcrd [expr {[lindex $coords 0] + 5}]
set ycrd [expr {([lindex $coords 1] + [lindex $coords 3])/2}]
set colour "black"
if { [info exists data_series($w,$series,-colour)] } {
set colour $data_series($w,$series,-colour)
}
set type "line"
if { [info exists data_series($w,$series,-type)] } {
set type $data_series($w,$series,-type)
}
if { $type == "line" || $type == "both" } {
$widget create line $xcrd $ycrd [expr {$xcrd+15}] $ycrd -fill $colour
}
$widget create text [expr {$xcrd+25}] $ycrd -text $value -anchor w
if { $type == "symbol" || $type == "both" } {
set symbol "dot"
if { [info exists data_series($w,$series,-symbol)] } {
set symbol $data_series($w,$series,-symbol)
}
DrawSymbolPixel $w $series [expr {$xcrd+7}] $ycrd $symbol $colour {}
}
#
# Reset the anchor
#
$table cellconfigure -anchor center
return
} else {
return $value
}
}
# createTableAndPlot --
# Create a combined plot and table
# Arguments:
# c Name of the canvas
# xlabels List of labels for the table header
# yscale Minimum, maximum and step for y-axis
# noseries Number of series (rows in the table)
# args List of options:
# -legendwidth pixels - Width for the left-most column
# -legendtext text - Text to show for "legend"
# Result:
# Name of a new command
# Note:
# No attention paid yet to how the options for the
# XY-plot and the table need to be combined into
# a single set
# Nor to positioning it via -box or -axesbox
#
proc ::Plotchart::createTableAndPlot {c xlabels yscale noseries args} {
variable config
variable style
variable scaling
set w [NewPlotInCanvas $c]
interp alias {} $w {} $c
ClearPlot $w
set newchart "tableplot_$w"
interp alias {} $newchart {} ::Plotchart::PlotHandler tableplot $w
CopyConfig tableplot $w
#
# Options
#
array set option {-legendwidth 100 -legendtext "Legend"}
array set option $args
#
# Compute the space required by the table
#
set currentStyle [plotstyle current]
set rowHeight $style($currentStyle,table,oddrow,height)
set tableHeight [expr {($noseries + 1) * $rowHeight}]
set scaling($c,reference) $c
set margin [expr {$option(-legendwidth) - 50}]
set margin [expr {$margin > 0? $margin : 0}]
set plotWidth [expr {[WidthCanvas $c 0] - $margin}]
set plotHeight [expr {[HeightCanvas $c 0] - $tableHeight}]
#
# Create the two components
#
foreach {ymin ymax ystep} $yscale {break}
set y $ymin
set ylabels [list]
while { $y <= $ymax+0.5*$ystep } {
set y [expr {$y + $ystep}]
lappend ylabels $y
}
set config($w,xyplot) [createXYPlot .c [list 0.0 [llength $xlabels] ""] [list $ymin $ymax {}] \
-ylabels $ylabels \
-box [list $margin 0 $plotWidth $plotHeight]]
foreach {xmin ymin xmax ymax tableWidth tableHeight} [$config($w,xyplot) plotarea] {break}
set columnWidth [expr {($xmax-$xmin+1) / [llength $xlabels]}]
set widths [list $option(-legendwidth)]
foreach x $xlabels {
lappend widths $columnWidth
}
set config($w,table) [createTableChart .c [concat [list $option(-legendtext)] $xlabels] $widths \
-axesbox [list $config($w,xyplot) sw -$option(-legendwidth) 0 $tableWidth $tableHeight]]
$config($w,table) formatcommand ::Plotchart::TableFillRow
return $newchart
}
# TablePlotDrawRow --
# Draw a data series and a row
# Arguments:
# w Name of the canvas
# series Data series
# yvalues Values to plot
#
proc ::Plotchart::TablePlotDrawRow {w series legend yvalues} {
variable config
set x -0.5
foreach y $yvalues {
set x [expr {$x + 1.0}]
$config($w,xyplot) plot $series $x $y
}
$config($w,table) separator
$config($w,table) cellconfigure -anchor right
$config($w,table) row [concat [list [list [$config($w,xyplot) canvas] $series $legend]] $yvalues]
}
# TablePlotDataConfig --
# Configure the data series
# Arguments:
# w NAme of the canvas
# args Arguments to configure the data series
#
proc ::Plotchart::TablePlotDataConfig {w args} {
variable config
$config($w,xyplot) dataconfig {*}$args
}
|