44 lines
1.0 KiB
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")
|
|
}
|
|
} |