Документация Engee

Галерея графиков Engee

В этом наборе примеров мы покажем, как выглядят самые разные виды графиков в Engee, и какими средствами достигается такой результат – примеры данных и кода.

Правильно подобранный тип графика позволяют сохранить или донести до слушателя нужную информацию в очень красноречивой, при этом лаконичной форме. Графики берут информацию из переменных, которые должны существовать в рабочей области памяти (должны быть видны в окне Переменные). Их отображение, как правило, осуществляется из интерактивных скриптов ngscript, сразу после соответствующих ячеек с кодом. Конечно, есть исключения

  • графики в формате Unicode можно отображать и в командной строке, однако при наличии графических интерактивных графиков, такой ограниченный формат может быть нужен разве что для нужд специального графического дизайна;

  • графики можно сохранять в файловое хранилище и открывать как файлы из файлового браузера (иногда это полезно).

Самая простая и часто используемая команда для выводов графиков – функция plot() из библиотеки Plots для вывода графиков.

При этом в экосистеме Engee/Julia есть еще множество библиотек для вывода красивых графиков, некоторые мы рассмотрим в этой демонстрации:

  • StatsPlots для вывода сложных статистических графиков,

  • GMT или General Mapping Tools для вывода географических карт.

Мы также советуем не избегать библиотек, позволяющих создавать гораздо более насыщенные и профессиональные визуализации, например:

  • Makie для очень качественной визуализации сложных данных,

  • Luxor – язык для создания векторной двухмерной графики.

Когда библиотека вывода построила график, она передает его в графическое окружение, и здесь есть варианты:

  • окружение gr (которое включено по умолчанию) строит быстрые, экономные и не интеравтивные графики (включается командой gr()), которые можно сохранить при помощи контекстного меню

  • plotly или plotlyjs создают интерактивное полотно, на котором график можно масштабировать, вращать и сохранять при помощи кнопок интерфейса (переключиться на них можно, соответственно, командами plotly() и plotlyjs())

А еще для вывода графиков вы можете выбрать растровый (png) или векторный (svg) формат. Указав внутри команд gr/plotly/plotlyjs аргумент fmt=:svg вы получите очень изящный, масштабируемый график в векторном формате, однако при наличии большого количества элементов на графике, особенно если он будет интерактивным, его вывод потребует больше ресурсов. Другое дело – растровые графики (fmt=:png). Они быстрее строятся и не требуют таких ресурсов при перерисовке.

Остальные элементы рецепта идеального графика вы найдете ниже.


А теперь, приглашаем – в галерею графиков!


using Plots
gr()
plot([1,2,3], [1,3,7])

interactive-scripts/images/data_analysis_plots_examples/f977a36d7a08a321fe564c0b787d1113bebec574

Анализ данных

Построение столбчатой диаграммы по таблице данных.

using Plots, DataFrames, HTTP, CSV;

url = "https://raw.githubusercontent.com/hflabs/city/master/city.csv"
data = sort( CSV.File( HTTP.get(url).body) |> DataFrame, ["population"], rev=true );

bar( first(data, 8).population, label="Население, чел.", xrotation = 30 )
xticks!( 1:8, first(data, 8).address )

interactive-scripts/images/data_analysis_plots_examples/2fdffbbeb64a43dcb8ce1d28a9a79fa16596902e

Изучение корреляции многомерных данных при помощи библиотеки StatsPlots и функции corrplor.

import Pkg; Pkg.add("StatsPlots", io=devnull)
using StatsPlots, DataFrames, LaTeXStrings

M = randn( 1000, 4 )
M[:,2] .+= 0.8sqrt.(abs.(M[:,1])) .- 0.5M[:,3] .+ 5
M[:,3] .-= 0.7M[:,1].^2 .+ 2
corrplot( M, label = [L"$x_i$" for i=1:4],
          xtickfontsize=4, ytickfontsize=6,
          guidefontcolor=:blue, yguidefontsize=15, yguidefontrotation=-45.0 )

interactive-scripts/images/data_analysis_plots_examples/09075aeae70e6816787bbd999364bab4f573f76e

Функция marginalkde из библиотеки StatsPlots

using Pkg; Pkg.add( "StatsPlots", io=devnull);
using StatsPlots

x = randn(1024)
y = randn(1024)
marginalkde(x, x+y)
┌ Warning: Keyword argument `orientation` is deprecated.
│ Please use `permute` instead.
└ @ Plots /usr/local/julia-1.9.3/packages/Plots/gzYVM/src/args.jl:1612

interactive-scripts/images/data_analysis_plots_examples/07c9e9bc9dda50c4966bbb837424da43d070bd9e

using DataFrames, Statistics, Plots

# Создадим данные
df = DataFrame(Возраст=rand(4), Баланс=rand(4), Должность=rand(4), Зарплата=rand(4))
cols = [:Возраст, :Баланс, :Должность]  # Выберем часть данных
M = cor(Matrix(df[!,cols]))       # Ковариационная матрица

# График
(n,m) = size(M)
heatmap( M, fc=cgrad([:white,:dodgerblue4]), xticks=(1:m,cols), xrot=90, yticks=(1:m,cols), yflip=true, leg=false )
annotate!( [(j, i, text(round(M[i,j],digits=3), 10,"Arial",:black)) for i in 1:n for j in 1:m] )

interactive-scripts/images/data_analysis_plots_examples/a1a900f636e908c144244cbfee6054fdfe3c036d

Обычная гистограмма: функция histogram

using Plots, Random
Random.seed!(2018)

x = randn(1000)
y = randn(1000)
z = randn(1000)

histogram(x, bins=20, alpha=0.4, label="A")
histogram!(y, bins=20, alpha=0.6, label="B")
histogram!(z, bins=20, alpha=0.8, label="C")

interactive-scripts/images/data_analysis_plots_examples/f920e1c0ac36396e1e4cfee49c241f28471d9b76

График распределения двухмерной выборки: функция histogram2d

using Plots

x = randn(10^4)
y = randn(10^4)

histogram2d(x, y)

interactive-scripts/images/data_analysis_plots_examples/4fb1cc1e01e604d9a215b03f3cd4c24029778045

Объемный график двухмерной гистограммы при помощи wireframe

using StatsBase, Plots

x = randn(10^4)
y = randn(10^4)
h = StatsBase.fit( Histogram, (x, y), nbins=20 )

wireframe( midpoints(h.edges[1]), midpoints(h.edges[2]), h.weights )

interactive-scripts/images/data_analysis_plots_examples/05343f039e104947130d908bd6c1360d2bedff0e

Совмещение графиков с различным оформлением

using Plots, Random

Random.seed!(1)
plot( Plots.fakedata(100, 12),
      layout = 4,
      palette = cgrad.([:grays :blues :heat :lightrainbow]),
      bg_inside = [:orange :pink :darkblue :black],
      seriestype= [:line :scatter :histogram :line] )

interactive-scripts/images/data_analysis_plots_examples/b39eb9bbe820971333bffd4f8498134cd609714a

Облако слов (wordcloud):

import Pkg; Pkg.add(["WordCloud"], io=devnull);
using WordCloud, HTTP

url = "https://ru.wikipedia.org/wiki/Математика"
resp = HTTP.request("GET", url, redirect=true)
content = resp.body |> String |> html2text

stopwords = ["на", "из", "это", "об", "что", "по", "млн", "за", "при", "www", "для", "не", "со", "но", "то"];
stopwords = vcat(stopwords, string.(collect(1:100)));

wc = wordcloud( processtext( content, maxnum=100, stopwords=stopwords ),
    mask=shape(ellipse, 600, 400, color=(0.98, 0.97, 0.99), backgroundcolor=1, backgroundsize=(700, 550)),
    masksize=:original, colors=:seaborn_icefire_gradient, angles=[0] ) |> generate!
paint(wc, "$(@__DIR__)/fromweb.svg")
wc
Total words: 3951.0. Unique words: 2329. After filtration: 2283.
The top 100 words are kept.
fonts = "DejaVu Sans Medium"
mask size: 550×700, volume: 435² (43²/word)
set fontsize ∈ [8.0, 550]
set density = 0.5
⋯scale=48.63088010719115, density=0.5043757036316644	↑
fontsize ∈ [12.91236121346613, 55.53500310789484]
▸1. Set spacing = 2; scale = 48.419472367376784
Completed after 15 epochs.

interactive-scripts/images/data_analysis_plots_examples/570a3c76554d2973c9b830103c65c6a05285094d

Анимация

Создание GIF-анимации при помощи команды @animate, запускающей в цикле стороннюю функцию, которая рисует 150 окружностей уменьшающегося радиуса, с растущим показателем прозрачности. Кроме прочих, можно также использовать формат mp4.

using Plots

@userplot CirclePlot
@recipe function f(cp::CirclePlot)
    x, y, i = cp.args
    n = length(x)
    inds = circshift(1:n, 1 - i)
    linewidth --> range(0, 10, length = n)
    seriesalpha --> range(0, 1, length = n)
    aspect_ratio --> 1
    label --> false
    x[inds], y[inds]
end

n = 150
t = range(0, 2π, length = n)
x = sin.(t)
y = cos.(t)

anim = @animate for i ∈ 1:n
    circleplot(x, y, i)
end
gif(anim, "$(@__DIR__)/anim_fps15.gif", fps = 15)
[ Info: Saved animation to /user/start/examples/data_analysis/plots_gallery/anim_fps15.gif
Plots.AnimatedGif("/user/start/examples/data_analysis/plots_gallery/anim_fps15.gif")
anim fps15
import Pkg; Pkg.add(["Meshes", "MeshIO"], io=devnull);
using Meshes, MeshIO, FileIO, Plots
gr();

obj = load( "$(@__DIR__)/data/lion.stl" );

@gif for az in 0:10:359
    p = plot( camera = (az, -20), axis=nothing, border=:none, aspect_ratio=:equal, size=(400,400) )
    for i in obj
        m = Matrix([i[1] i[2] i[3] i[1]])'
        if m[1,1] > 0 plot!( p, m[:,1], m[:,2], m[:,3], lc=:green, label=:none, lw=.4, aspect=:equal )
        else plot!( p, m[:,1], m[:,2], m[:,3], lc=:gray, label=:none, lw=.4, aspect=:equal )
        end
    end
end
[ Info: Saved animation to /user/start/examples/data_analysis/plots_gallery/tmp.gif
tmp

Вывод матриц и изображений

Функция heatmap

using Plots

include( "$(@__DIR__)/data/peaks.jl" );

(x, y, z) = peaks()
heatmap(x, y, z)

interactive-scripts/images/data_analysis_plots_examples/fd20e31f7896128b6f65ab70a625b3c1ffa8ddb3

using Plots, LaTeXStrings

x = range( -1.3, 1.3, 501 );
y = range( -1.3, 1.3, 501 );

X = repeat( x, outer = [1,501] )
Y = repeat( y', outer = [501,1] )

#C = ones( size(X) ) .* ( 0.360284 + 0.100376*1im );
C = ones( size(X) ) .* ( -0.75 + 0.1im );

Z_max = 1e6; it_max = 50;

Z = Complex.( X, Y );
B = zeros( size(C) );

for k = 1:it_max
    Z = Z.^2 .+ C;
    B = B .+ ( abs.(Z) .< 2 );
end

heatmap( B,
         aspect_ratio = :equal,
         cbar=false,
         axis=([], false),
         color=:jet )
title!( L"Julia Set $(c=0.360284+0.100376i)$" )

interactive-scripts/images/data_analysis_plots_examples/79352cc039e2ada3e61bf71de35a89957dbac1ef

Вывод иллюстраций из файлов: библиотека Images

using Images

load( "$(@__DIR__)/data/640px-Business_Centre_of_Moscow_2.jpg" )
[ Info: Precompiling Images [916415d5-f1e6-5110-898d-aaa5f9f070e0]

interactive-scripts/images/data_analysis_plots_examples/5a41024c4b23172e8e3c5af4a6743c7651f01bd9

Графики в декартовых координатах

Вывод двух тригонометрических функций, заданных векторами, на декартовой координатной плоскости.

using Plots

x = 0:0.1:2pi
y1 = cos.(x)
y2 = sin.(x)

plot(x, y1, c="blue", linewidth=3, label="cos")
plot!(x, y2, c="red", line=:dash, label="sin")
title!("Тригонометрические функции")
xlabel!("Угол (рад)")
ylabel!("sin(x) и cos(x)")

# Отдельной командой установим границы осей
plot!( xlims=(0,2pi), ylims=(-2, 2) )

interactive-scripts/images/data_analysis_plots_examples/992dd35cc9402338a47c5a81b03aa8dffc07a177

Заполнение площади под графиком (аргумент fillrange)

using Plots, Distributions

x = range(-3, 3, 100 )
y = pdf.( Normal(0,1), x )

ix = abs.(x) .< 1
plot( x[ix], y[ix], fillrange = zero(x[ix]), fc=:blues, leg=false)
plot!( x, y, grid=false, lc=:black, widen=false )
WARNING: using Distributions.shape in module Main conflicts with an existing identifier.

interactive-scripts/images/data_analysis_plots_examples/5fe2b89fdb0cc2360b77373ed328308435d2abc7

График с заполнением (area)

using Plots

x = 1:10;
areaData = x .* rand(10,5) .* 5;
cur_colors = theme_palette(:default)

plot()
for i in 1:size(areaData,2)
    plot!( areaData[i,:], fillcolor = cur_colors[i], fillrange = 0, fillalpha=.5 )
end
plot!()

interactive-scripts/images/data_analysis_plots_examples/54c642e5f23da0b6b423a51d30acff81ec76fccc

Накопляющийся график с заполнением

using Plots

x = 1:10;
areaData = x .* rand(10,5);
cur_colors = theme_palette(:default)

plot()
for i in size(areaData,2):-1:1
    plot!( sum(areaData[:,1:i], dims=2), fillcolor = cur_colors[i], fillrange = 0, lw=0 )
end
plot!()

interactive-scripts/images/data_analysis_plots_examples/e7bf4c6f9ffe69fa4ca6805b14b0f8674fa48d0d

График с доверительными интервалами (аргументы xerr и yerr)

using Plots, Random
Random.seed!(2018)

f(x) = 2 * x + 1
x = 0:0.1:2
n = length(x)
y = f.(x) + randn(n)

plot( x, y,
      xerr = 0.1 * rand(n),
      yerr = rand(n),
      marker = (:circle, :red) )

interactive-scripts/images/data_analysis_plots_examples/205b4f22184f63ca5c350bea001039b980040b54

Трехмерный график

using Plots

t = 0:pi/100:10pi;
x1 = sin.(1 * t)
y1 = cos.(1 * t)

x2 = sin.(2 * t)
y2 = cos.(2 * t)

plot(
    plot( x1, y1, t, leg=false, lw=2 ),
    plot( x2, y2, t, leg=false, lw=2 )
)

interactive-scripts/images/data_analysis_plots_examples/94ce1086c81e2f3073c20efc9a2eeddb62414968

Гладкий и ступенчатый графики, объединенные при помощи аргумента layout

using Plots

x = range( 1, 2pi, length=50 )

plot( x, [sin.(x) sin.(x)],
      seriestype=[:line :step],
      layout = (2, 1) )

interactive-scripts/images/data_analysis_plots_examples/ab8cc163ba1603eca29779c9868cc9ccd274eec8

Параметрический график в 3D

using Plots

t = range(0, stop=10, length=1000)

x = cos.(t)
y = sin.(t)
z = sin.(5t)

plot( x, y, z )

interactive-scripts/images/data_analysis_plots_examples/bc7783a7a1d69da06059e4345840f1af3a120fd8

Графики в полярных координатах

Стрелки к точкам, формирующим спираль (график quiver)

using Plots

cur_colors = theme_palette(:roma);
th = range( 0, 3*pi/2, 10 );
r = range( 5, 20, 10 );
c = collect(1:10)

X = r .* cos.(th)
Y = r .* sin.(th)

quiver( r.*0, r.*0, quiver=(th,r), aspect_ratio=:equal, proj=:polar,
        line_z=repeat(c, inner=4), c=:roma, cbar=false, lw=2 )

interactive-scripts/images/data_analysis_plots_examples/755674bd018a39ee51dbcda3f5b9dcba84aff39c

Функция pie

using Plots

x = [ "Энтузиасты", "Экспериментаторы", "Ученые" ]
y = [0.4,0.35,0.25]

pie(x, y, title="Кто использует Julia",l = 0.5)

interactive-scripts/images/data_analysis_plots_examples/f55f5354eab09e747fd607cd08bb2089b36e5b54

Функция polar

using Plots

θ = range(0, 2π, length=50)
r = 1 .+ cos.(θ) .* sin.(θ).^2

plot(θ, r, proj=:polar, lims=(0,1.5))

interactive-scripts/images/data_analysis_plots_examples/b8251944fb37ca948e007a013c5d07489bcece29

Ступенчатый график в полярных координатах (график rose)

using Random
Random.seed!(2018)

n = 24
R = rand(n+1)
θ = 0:2pi/n:2pi
plot( θ, R, proj=:polar, line=:steppre, lims=(0,1) )

interactive-scripts/images/data_analysis_plots_examples/0d4ba2ae0db8811a9ed535127688f724a38d1aa4

График в полярных координатах, заданный при помощи функции

using Plots

θ = range( 0, 8π, length=1000 )
fr(θ) = sin( 5/4 * θ )

plot( θ, fr.(θ), proj=:polar, lims=(0,1) )

interactive-scripts/images/data_analysis_plots_examples/e49ad11e91e87e1a7d8da0baca81e15e89f7fed0

Пузырьковая диаграмма в полярных координатах

using Plots
include( "$(@__DIR__)/data/planetData.jl" );

scatter( angle, distance, ms=diameter, mc = c,
         proj=:polar, legend=false,
         markerstrokewidth=1, markeralpha=.7 )
title!( "Планеты Солнечной системы" )

interactive-scripts/images/data_analysis_plots_examples/c0b1e4259036810b00b7a1d720569f250d0603e7

Географические карты

Нанесение обозначений на карту (библиотека GMT, функции coast и scatter)

using Pkg; Pkg.add("GMT", io=devnull)
import GMT

GMT.coast(
    region="0/40/30/60+r",
    proj=(name=:laea, center=[10,50]),
    frame=:ag, res=:low, area=500, shore=:thick, borders=1,
    water=:blue,
    # Выделим несколько стран другими цветами
    DCW=((country="DE", pen=(1,:red)), (country="GB,IT,FR", fill=:green), (country="FI,NO,SE", fill=:yellow)),
    figsize=2.8
)

GMT.scatter!( rand(5:15, 12), rand(47:55, 12), fmt=:png,
    marker=:circle, markeredgecolor=0, size=0.0, markerfacecolor=:orange, show=true )
[ Info: Precompiling GMTDataFramesExt [b0121151-b40e-578b-8798-214dacfa5da6]

interactive-scripts/images/data_analysis_plots_examples/c981a882d1cab1a76aa89d3e075ce0fe09db66c1

Отображение карты с рельефом океанов. При первом запуске, карта будет загружена с сервера.

using Pkg; Pkg.add("GMT", io=devnull)
import GMT

GMT.grdimage( "@earth_relief_20m_g", proj=:Winkel,
          colorbar=true, coast=false, show=true )
grdimage [NOTICE]: Remote data courtesy of GMT data server oceania [http://oceania.generic-mapping-tools.org]

grdimage [NOTICE]: SRTM15 Earth Relief v2.5.5 at 20x20 arc minutes reduced by Gaussian Cartesian filtering (104.8 km fullwidth) [Tozer et al., 2019].
grdimage [NOTICE]:   -> Download grid file [800K]: earth_relief_20m_g.grd

interactive-scripts/images/data_analysis_plots_examples/c99df9eb7bc0796ba5d35d19a6180d6f03417534

Дискретные данные

Горизонтально расположенная столбчатая диаграмма (функция bar)

ticklabel = string.( collect('а':'м') )
bar(1:12, orientation=:h, yticks=(1:12, ticklabel), yflip=true)

interactive-scripts/images/data_analysis_plots_examples/d63c638d6781771b35cd5d585d7b7ce361715be5

Столбчатые диаграммы bar и groupedbar

import Pkg; Pkg.add("StatsPlots", io=devnull)
using StatsPlots
include( "$(@__DIR__)/data/BostonTemp.jl" );

plots_id = [1,2,3];

groupedbar( hcat([Temperatures[i,:] for i in plots_id]...),
            xticks=(1:12, Months),
            label = [Years[i] for i in plots_id]',
            color = reshape(palette(:tab10)[1:3], (1,3)) )

interactive-scripts/images/data_analysis_plots_examples/429f448531599e81e05a30abdd6c75675f0c289c

Диаграмма stem (ствол-лист)

using Plots

x1 = range( 0, 2pi, 50 );
x2 = range( pi, 3pi, 50 );

X = [x1, x2];
Y = [cos.(x1), 0.5.*sin.(x2)];

plot( X, Y, line=:stem, marker=:circle )

interactive-scripts/images/data_analysis_plots_examples/5a237bcafbae58847d97de47adae1d5d569c7246

Трехмерная stem-диаграмма

X = repeat( range(0,1,10), outer = [1,10] )
Y = repeat( range(0,1,10)', outer = [10,1] )

Z = exp.(X.+Y)

plot( X, Y, Z, line=:stem, color=:skyblue, markercolor=:white, marker=:circle, leg=false )

interactive-scripts/images/data_analysis_plots_examples/99d8289a17ac2f727b63809c69b1fdf1eafff834

Контурные графики

График обтекания цилиндра ламинарным потоком.

Аналитическая аппроксимация этой функции рассчитывается при помощи уравнения:

using Plots
include( "$(@__DIR__)/data/flowAroundCylinder.jl" );

(r, theta, x, y, streamline, pressure) = flowAroundCylinder();

plot( x, y, streamline, levels=60, seriestype=:contour,
      xlim = [-5,5], ylim=[-5,5], cbar=false, linewidth=2,
      leg=false, color=:haline )

(xx,yy) = circle( 0, 0, 1 );

plot!( xx, yy, lw=2, lc=:black )

interactive-scripts/images/data_analysis_plots_examples/036fe94d190d99109d9082fa0adf60aba7c7ec48

Заполненный контурный график (статическое давление вокруг цилиндра, обтекаемого ламинарным потоком)

using Plots
include( "$(@__DIR__)/data/flowAroundCylinder.jl" );

(r, theta, x, y, streamline, pressure) = flowAroundCylinder();
plot( x, y, pressure, seriestype=:contourf, xlim = [-5,5], ylim=[-5,5], cbar=false, linewidth=1, leg=false )

(xx,yy) = circle( 0, 0, 1 );
plot!( xx, yy, lw=2, lc=:black )

interactive-scripts/images/data_analysis_plots_examples/03261a59c9cfc624e50f14b52ac8be200e650187

Контурный график математических функций

using Plots

# Подготовим данные
y = x = range( -7, 7, step=0.1 )
z = @. sin(x) + cos(y')

Plots.contour( x, y, z, color=:haline )

interactive-scripts/images/data_analysis_plots_examples/06c2fb7d375e2eb091099268f602be1bd2cded74

Поверхности и сетки

Параметр seriestype=:surface

using Plots

# Подготовим данные
y = x = range( -7, 7, step=0.1 )
z = @. sin(x) + cos(y')

plot( x, y, z, st=:surface, color=:cool )

interactive-scripts/images/data_analysis_plots_examples/7f6da2d5d3308cebf51130bcdf9172fd9bb5d9c5

Параметр seriestype=:wireframe

using Plots

# Подготовим данные
y = x = range( -7, 7, step=0.5 )
z = @. sin(x) + cos(y')

plot( x, y, z, st=:wireframe )

interactive-scripts/images/data_analysis_plots_examples/212225ade3e1caf64b9481faf44eacb2c36795d0

График двухмерной функции

using Plots
include( "$(@__DIR__)/data/peaks.jl" );

(x,y,z) = peaks();

plot( x, y, z; levels=20, st=:surface )

interactive-scripts/images/data_analysis_plots_examples/73fb75844bb9d7cb395532267f7e1cd9113ebd65

Точечные графики и пузырьковые диаграммы

Пузырьковая диаграмма

using Random: seed!
using Plots

seed!(28)
xyz = randn(100, 3)

scatter( xyz[:, 1], xyz[:, 2], marker_z=xyz[:, 3],
         label="Окружности",
         colormap=:plasma, cbar=false,
         markersize=15 * abs.(xyz[:, 3]),
         xlimits=[-3,3], ylimits=[-3,3]
       )

interactive-scripts/images/data_analysis_plots_examples/9bd2247a722f433897343c0bd156bd707544eea4

Трехмерный точечный график с назначением отдельного цвета каждой точке

using Colors, ColorSchemes
cs = ColorScheme([colorant"yellow", colorant"red"])

interactive-scripts/images/data_analysis_plots_examples/1f58d7a7b0942d6f712ddd26d7443f7cdfa7141b

using CSV, DataFrames, Plots

df = DataFrame(CSV.File( "$(@__DIR__)/data/seamount.csv" ))
C = get( cs, df.z, :extrema )

scatter( df.x, df.y, df.z, c=C, leg=false )

interactive-scripts/images/data_analysis_plots_examples/4b0ac13e25844b55964bdc87984e142f7f9a9a31

Трехмерный точечный график с фиктивным пространством для цветовой гисторгаммы

using CSV, DataFrames, Plots

df = DataFrame(CSV.File( "$(@__DIR__)/data/seamount.csv" ))
cs = cgrad(:thermal)
C = get( cs, df.x, :extrema )

l = @layout [a{0.97w} b]
p1 = scatter( df.x, df.y, df.z, c=C, leg=false )
p2 = heatmap(rand(2,2), clims=(0,10), framestyle=:none, c=cgrad(cs), cbar=true, lims=(-1,0))
plot(p1, p2, layout=l)

interactive-scripts/images/data_analysis_plots_examples/aee1e2e4d35f654ec022102e96a4d6c6935e5b78

GKS: Rectangle definition is invalid in routine SET_VIEWPORT
GKS: Rectangle definition is invalid in routine SET_VIEWPORT
GKS: Rectangle definition is invalid in routine SET_VIEWPORT