1 package prefuse.action.assignment; 2 3 import java.util.logging.Logger ; 4 5 import prefuse.Constants; 6 import prefuse.data.tuple.TupleSet; 7 import prefuse.util.DataLib; 8 import prefuse.util.MathLib; 9 import prefuse.util.PrefuseLib; 10 import prefuse.visual.VisualItem; 11 12 52 public class DataSizeAction extends SizeAction { 53 54 protected static final double NO_SIZE = Double.NaN; 55 56 protected String m_dataField; 57 58 protected double m_minSize = 1; 59 protected double m_sizeRange; 60 61 protected int m_scale = Constants.LINEAR_SCALE; 62 protected int m_bins = Constants.CONTINUOUS; 63 64 protected boolean m_inferBounds = true; 65 protected boolean m_inferRange = true; 66 protected boolean m_is2DArea = true; 67 protected double[] m_dist; 68 69 protected int m_tempScale; 70 71 76 public DataSizeAction(String group, String field) { 77 super(group, NO_SIZE); 78 m_dataField = field; 79 } 80 81 87 public DataSizeAction(String group, String field, int bins) { 88 this(group, field, bins, Constants.LINEAR_SCALE); 89 } 90 91 103 public DataSizeAction(String group, String field, int bins, int scale) { 104 super(group, NO_SIZE); 105 m_dataField = field; 106 setScale(scale); 107 setBinCount(bins); 108 } 109 110 112 116 public String getDataField() { 117 return m_dataField; 118 } 119 120 124 public void setDataField(String field) { 125 m_dataField = field; 126 } 127 128 136 public int getScale() { 137 return m_scale; 138 } 139 140 152 public void setScale(int scale) { 153 if ( scale < 0 || scale >= Constants.SCALE_COUNT ) 154 throw new IllegalArgumentException ( 155 "Unrecognized scale value: "+scale); 156 m_scale = scale; 157 } 158 159 163 public int getBinCount() { 164 return m_bins; 165 } 166 167 175 public void setBinCount(int count) { 176 if ( m_scale == Constants.QUANTILE_SCALE && count <= 0 ) { 177 throw new IllegalArgumentException ( 178 "The quantile scale can not be used without binning. " + 179 "Use a bin value greater than zero."); 180 } 181 m_bins = count; 182 } 183 184 193 public boolean is2DArea() { 194 return m_is2DArea; 195 } 196 197 206 public void setIs2DArea(boolean isArea) { 207 m_is2DArea = isArea; 208 } 209 210 214 public double getMinimumSize() { 215 return m_minSize; 216 } 217 218 223 public void setMinimumSize(double size) { 224 if ( Double.isInfinite(size) || 225 Double.isNaN(size) || 226 size <= 0 ) 227 { 228 throw new IllegalArgumentException ("Minimum size value must be a " 229 + "finite number greater than zero."); 230 } 231 232 if ( m_inferRange ) { 233 m_sizeRange += m_minSize - size; 234 } 235 m_minSize = size; 236 } 237 238 253 public double getMaximumSize() { 254 return m_minSize + m_sizeRange; 255 } 256 257 272 public void setMaximumSize(double maxSize) { 273 if ( Double.isInfinite(maxSize) || 274 Double.isNaN(maxSize) || 275 maxSize <= 0 ) 276 { 277 m_inferRange = true; 278 } else { 279 m_inferRange = false; 280 m_sizeRange = maxSize-m_minSize; 281 } 282 } 283 284 290 public void setDefaultSize(double defaultSize) { 291 throw new UnsupportedOperationException (); 292 } 293 294 296 299 protected void setup() { 300 TupleSet ts = m_vis.getGroup(m_group); 301 302 m_tempScale = m_scale; 304 305 if ( m_inferBounds ) { 306 if ( m_scale == Constants.QUANTILE_SCALE && m_bins > 0 ) { 307 double[] values = 308 DataLib.toDoubleArray(ts.tuples(), m_dataField); 309 m_dist = MathLib.quantiles(m_bins, values); 310 } else { 311 if ( m_scale == Constants.QUANTILE_SCALE ) { 313 Logger.getLogger(getClass().getName()).warning( 314 "Can't use quantile scale with no binning. " + 315 "Defaulting to linear scale. Set the bin value " + 316 "greater than zero to use a quantile scale."); 317 m_scale = Constants.LINEAR_SCALE; 318 } 319 m_dist = new double[2]; 320 m_dist[0]= DataLib.min(ts, m_dataField).getDouble(m_dataField); 321 m_dist[1]= DataLib.max(ts, m_dataField).getDouble(m_dataField); 322 } 323 if ( m_inferRange ) { 324 m_sizeRange = m_dist[m_dist.length-1]/m_dist[0] - m_minSize; 325 } 326 } 327 } 328 329 332 protected void finish() { 333 m_scale = m_tempScale; 335 } 336 337 340 public double getSize(VisualItem item) { 341 double size = super.getSize(item); 343 if ( !Double.isNaN(size) ) { 344 return size; 345 } 346 347 double v = item.getDouble(m_dataField); 349 double f = MathLib.interp(m_scale, v, m_dist); 350 if ( m_bins < 1 ) { 351 v = m_minSize + f * m_sizeRange; 353 } else { 354 int bin = f < 1.0 ? (int)(f*m_bins) : m_bins-1; 356 v = m_minSize + bin*(m_sizeRange/(m_bins-1)); 357 } 358 return m_is2DArea ? PrefuseLib.getSize2D(v) : v; 362 } 363 364 } | Popular Tags |