mimir-pip/lib/test/src/org/mimirdb/pip/lib/Scatterplot.scala

44 lines
1.0 KiB
Scala

package org.mimirdb.pip.lib
object Scatterplot
{
def apply(elems: Iterable[(Double, Double)],
width: Int = 80,
height: Int = 40
): String =
{
val buffer =
Array.fill(height){ Array.fill(width)(" ") }
val minX = Math.min(elems.map { _._1 }.min, 0)
val maxX = Math.max(elems.map { _._1 }.max, 0)
val offsetX = maxX - minX
val minY = Math.min(elems.map { _._2 }.min, 0)
val maxY = Math.max(elems.map { _._2 }.max, 0)
val offsetY = maxY - minY
def xToScreen(x: Double): Int =
((x - minX) / offsetX * (width-1)).toInt
def yToScreen(y: Double): Int =
((y - minY) / offsetY * (height-1)).toInt
val x0 = xToScreen(0.0)
for( y <- 0 until height )
{
buffer(y)(x0) = "|"
}
val y0 = yToScreen(0.0)
for( x <- 0 until width )
{
buffer(y0)(x) = "-"
}
buffer(y0)(x0) = "+"
for( (x, y) <- elems ){
buffer(yToScreen(y))(xToScreen(x)) = "*"
}
return buffer.reverse.map { _.mkString }.mkString("\n")
}
}