%useLatestDescriptors %use lets-plot fun linspace(start: Double, stop: Double, num: Int): List { return List(num) { i -> start + i * ((stop - start) / (num - 1)) } } fun F(x: Double, y: Double, a: Double = 0.0, b: Double = 0.0): Double { return y.pow(2) - x.pow(3) - a * x - b } fun level(z: Double, c: Double = 1.0): Double { return exp(-c * abs(z)) } val n = 300 val a = -1.0 val b = 0.0 val xRange = linspace(-3.0, 3.0, n + 1) val yRange = linspace(-3.0, 3.0, n + 1) val zippedData = xRange.map { x -> yRange.map { y -> Triple(x, y, level(F(x, y, a = a, b = b), c = 10.0)) } }.flatten() val data = mapOf( "x" to zippedData.map { it.first }, "y" to zippedData.map { it.second }, "z" to zippedData.map { it.third }, ) letsPlot(data) + geomRaster(showLegend = false) { x="x"; y="y"; fill="z" } + scaleFillGradient(low="#253494", high="#ffffcc") + ggtitle("Elliptic curve with a = $a, b = $b", "Simple way to draw an algebraic curve - with geomRaster()") + ggsize(800, 600) + themeClassic() + theme(axis = "blank")