Temat 6: Wizualizacja danychNajważniejsze pakiety:Plots

42  Download (0)

Pełen tekst

(1)

Temat 6: Wizualizacja danych

Najważniejsze pakiety:

Plots - najpowszechniejsza i bardzo przyjazna w obsłudze PyPlot - interfejs do Matplotliba z Pythona

Makie - rozbudowana biblioteka tworząca wykresy i grafikę wysokiej jakości, rozbudowane opcje 3D

Omówimy tę pierwszą.

Biblioteka Plots oferuje wybór kilku silników graficznych, przełączamy się komendami

pyplot(), gr(), plotly() . Nie wszystkie opcje wykresów są dostępne dla wszystkich, ale te najważniejsze tak.

Opcji i rodzajów wykresów jest w Plots dużo, warto korzystać z oficjalnej dokoumentacji:

http://docs.juliaplots.org/latest/

oraz szczególnie

http://docs.juliaplots.org/latest/attributes/

Wyświetlanie i zapisywanie wykresów

Wiersz komend oraz IDE Julii wyświetlają na ekran ostatni wynik. Jeżeli jest nim wykres, to zostanie wyświetlony.

Zawsze możemy wymusić wyświetlenie wykresu komendą display .

Zawsze możemy zapisać wykres do zmiennej typu Plot i później manipulować nim i wyświetlać go na żądanie. Możemy manipulować wieloma na zmianę.

Domyślnie manipulujemy ostatnim wykresem, który był wyświetlony.

In [1]: using Plots # ładuje Plots

In [2]: plot(1:10) # wyświetlony

(2)

5 Out[2]:

In [3]: plot(1:10) # nie wyświetliło, to nie ostatni wynik x = 5

Out[3]:

In [4]: plot(1:10) |> display x = 5

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(3)

5

7 Out[4]:

In [13]: p = plot(1:11,rand(-5:5,11)) x = 7

Out[13]:

In [14]: display(p)

(4)

Zapis wykresów

savefig([p::Plot],"nazwa.rozszerzenie")

Domyślnie zapisuje ostatni wyświetlony wykres i umieszcza katalogu roboczym lub jego wskazanym podfolderze.

Aktualny katalog roboczy: komenda pwd() .

Zmiana katalogu roboczego: komenda cd("ścieżka") .

"E:\\Desktop\\Pakiety\\wykłady2021"

Jak wybrać format wykresu

png

+ mały rozmiar pliku + prosty do otwierania - nie skaluje się

svg

+ skaluje się

+ bogate możliwości edycji - trudny do otwierania In [15]: pwd()

Out[15]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(5)

pdf

+ prosty do otwierania + skaluje się

- w celu edycji trzeba zmienić format Zwykle dobrym wyborem jest pdf.

Zasady grafiki naukowej

Grafikę naukową dzielimy na 2 dość ogólne rodzaje:

Grafika specjalistyczna/inżynierska:

skierowana do wyrobionego odbiorcy

priorytetem jest dokładność i zakres informacji może operować branożowymi terminami wymaga mniejszej ilości tłumaczeń Grafika popularnonaukowa:

przeznaczona dla ogólnego odbiorcy

priorytetem jest przekazanie najważniejszych idei powinna operować powszechnym słownictwem Priorytety przy tworzeniu grafiki naukowej:

1. Czytelność, jasność przekazu informacji.

2. Stosowanie się do konwencji branżowej.

3. Estetyka, o ile nie wadzi 1. oraz 2.

4. Gust, własne upodobania, o ile nie wadzą 1., 2. oraz 3.

Tworzenie linii

Plots udostępnia 2 podstawowe sposoby:

A. Już znany plot(xs,ys,opcje) In [16]: savefig("myPlot.pdf")

(6)

plot(f::Function,a,b,opcje ) Podobnie scatter .

Zaczniemy od B, w nim Julia sama postara się dobrać punkty tak, aby wykres był gładki.

In [17]: plot(sin,-pi,pi)

Out[17]:

In [18]: plot(x->x^2,-2,2)

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(7)

Out[18]:

In [21]: plot(x->abs(x^2-1),-2,2, markers=:circle) # dobry

Out[21]:

(8)

MethodError: no method matching f(::Float64) Closest candidates are:

f(::Any, ::Any) at In[22]:1 Stacktrace:

[1] (::ComposedFunction{RecipesPipeline.var"#7#8"{Symbol}, typeof(f)})(x::Fl oat64) (repeats 2 times)

@ Base .\operators.jl:938

[2] (::PlotUtils.var"#27#29"{ComposedFunction{ComposedFunction{RecipesPipeli ne.var"#7#8"{Symbol}, typeof(f)}, RecipesPipeline.var"#9#10"{Symbol}}})(x::Flo at64)

@ PlotUtils ~\.julia\packages\PlotUtils\es5pb\src\adapted_grid.jl:46 [3] _broadcast_getindex_evalf

@ .\broadcast.jl:648 [inlined]

[4] _broadcast_getindex

@ .\broadcast.jl:621 [inlined]

[5] getindex

@ .\broadcast.jl:575 [inlined]

[6] macro expansion

@ .\broadcast.jl:984 [inlined]

[7] macro expansion

@ .\simdloop.jl:77 [inlined]

[8] copyto!

@ .\broadcast.jl:983 [inlined]

[9] copyto!

@ .\broadcast.jl:936 [inlined]

[10] copy

@ .\broadcast.jl:908 [inlined]

[11] materialize

@ .\broadcast.jl:883 [inlined]

[12] adapted_grid(f::ComposedFunction{ComposedFunction{RecipesPipeline.var"#7

#8"{Symbol}, typeof(f)}, RecipesPipeline.var"#9#10"{Symbol}}, minmax::Tuple{Fl oat64, Float64}; max_recursions::Int64, max_curvature::Float64)

@ PlotUtils ~\.julia\packages\PlotUtils\es5pb\src\adapted_grid.jl:57 [13] adapted_grid(f::Function, minmax::Tuple{Float64, Float64})

@ PlotUtils ~\.julia\packages\PlotUtils\es5pb\src\adapted_grid.jl:16

[14] _scaled_adapted_grid(f::Function, xscale::Symbol, yscale::Symbol, xmin::

Int64, xmax::Int64)

@ RecipesPipeline ~\.julia\packages\RecipesPipeline\VEk89\src\user_recipe.

jl:353

[15] macro expansion

@ ~\.julia\packages\RecipesPipeline\VEk89\src\user_recipe.jl:293 [inlined]

[16] apply_recipe(plotattributes::AbstractDict{Symbol, Any}, f::Function, xmi n::Number, xmax::Number)

@ RecipesPipeline ~\.julia\packages\RecipesBase\92zOw\src\RecipesBase.jl:2 82 [17] _process_userrecipes!(plt::Any, plotattributes::Any, args::Any)

@ RecipesPipeline ~\.julia\packages\RecipesPipeline\VEk89\src\user_recipe.

jl:36

[18] recipe_pipeline!(plt::Any, plotattributes::Any, args::Any)

@ RecipesPipeline ~\.julia\packages\RecipesPipeline\VEk89\src\RecipesPipel ine.jl:70

[19] _plot!(plt::Plots.Plot, plotattributes::Any, args::Any) @ Plots ~\.julia\packages\Plots\SjqWU\src\plot.jl:172 [20] plot(::Any, ::Vararg{Any, N} where N; kw::Any) @ Plots ~\.julia\packages\Plots\SjqWU\src\plot.jl:58 [21] plot(::Any, ::Any, ::Vararg{Any, N} where N)

@ Plots ~\.julia\packages\Plots\SjqWU\src\plot.jl:52 [22] top-level scope

@ In[22]:3 [23] eval

@ .\boot.jl:360 [inlined]

[24] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::Strin g, filename::String)

@ Base .\loading.jl:1094

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(9)

Używając A musimy sami pilnować, aby ilość punktów pozwoliła na uzyskanie gładkiego wykresu.

In [23]: plot(x->f(x,2), 0, 3) # już 1 argumentu, y = 2

Out[23]:

In [25]: t = LinRange(-2,2,10)

plot(t,sin.(1 ./t))

(10)

Wykres liniowy vs punktowy

Out[25]:

In [26]: t = LinRange(-2,2,1000) # już dobrze, więcej punktów

plot(t,sin.(1 ./t))

Out[26]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(11)

Linii używamy do zaznaczania zjawisk ciągłych, np. teoretycznych przewidywań dla każdego t.

Punktów używamy do zaznaczania zjawisk dyskretnych, np. danych doświadczalnych, pomiarów oddzielonych w czasie. itp.

Wybór zależy od tego, czy ciągła krzywa jest istotną informacją, czy też nie. Ciągła krzywa może być myląca.

Możemy też łączyć jedno i drugie!

In [28]: plot(1:6,factorial.(1:6)) # źle, silnia jest zdefiniowana tylko dla liczb naturalnych!

Out[28]:

In [30]: scatter(1:6,factorial.(1:6)) # dobrze

(12)

Wiele linii na jednym wykresie

Dwie najważniejsze metody:

Out[30]:

In [31]: plot(1:6,factorial.(1:6), markers = :circle) # dobrze, o ile chcemy zaznaczyć trend lub coś pod

Out[31]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(13)

Dodajemy linie komendami plot!, scatter! lub plot!(p,...), scatter!(p,...) (do wybranego).

Podajemy macierz z wartościami y kolejnych linii.

Przy zbyt dużej ilości wykresy robią się nieczytelne!

In [32]: plot(sin,-pi,pi) plot!(cos,-pi,pi)

Out[32]:

In [33]: xs = LinRange(-pi,pi,500)

ys = zeros(500,2) # 2 kolumny = 2 linie ys[:,1] .= xs .^2

ys[:,2] .= xs .- 1 plot(xs,ys)

(14)

Out[33]:

In [38]: scatter(rand(30,40),legend = :none) # 40 serii danych po 30 punktów

# kompletnie nieczytelne Out[38]:

In [39]: plot(rand(30,40),legend = :none)

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(15)

Wykresy parametryczne

Różnego rodzaju krzywe często łatwiej jest opisać parametrami nie będącymi . Najprostszym przykładem jest okrąg, który możemy traktować jako zbiór punktów

dla . W takim przypadku zawsze możemy ręcznie stworzyć odpowiednie listy x oraz y jak wcześniej, ale można prościej.

Składnia:

plot(fx::Function, fy::Function, a,b,opcje) fx - funkcja zwracająca x

fy - funkcja zwracająca y a, b - zakres parametru Out[39]:

y= y(x)

x= sin(t), y = cos(t)

−π < t < π

In [41]: plot(cos,sin,-pi,pi, aspectratio=1)

(16)

Out[41]:

In [42]: plot(cos,sin,0,pi, aspectratio=1) # pół okręgu, mniejszy zakres parametru

Out[42]:

In [44]: plot([cos, x->cos(x)+1],[sin, x -> sin(x)-1],-pi,pi, aspectratio=1) # dwa na raz

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(17)

Wykresy biegunowe

Czyli takie, w których rysujemy jako funkcję . Składnia: wystarczy dodać opcję proj = :polar . Out[44]:

r θ

In [46]: # przykład

θs = LinRange(-2pi,2pi,500) rs = θs .+ 1

plot(θs, rs, proj = :polar)

(18)

Modyfikowanie wyglądu wykresów

Out[46]:

In [48]: # funkcyjnie, r = r(theta)

plot(θ->θ,0, 2pi, proj = :polar) # spirala Archimedesa

Out[48]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(19)

Jak widzimy wygląd wykresów w Plots zmienia się poprzez modyfikację jego własności, które można wymieniać po przecinkach. Dla przejrzystości warto je wymieniać w nowych liniach.

Opcje zwykle wybieramy symbolami, np. :log10, :red itp.

Rodzaje linii

:solid, :dash, :dot, :dashdot

Różnych rodzajów linii zwykle używamy do zaznaczania różnego typu danych, np. krzywych pomiarowych i teoretycznych.

Grubość linii: linewidth

In [54]: xs = LinRange(-pi,pi,500) ys = sin.(xs)

plot(xs, sin.(xs) .+ 0.1randn(500))

plot!(xs,ys, linestyle = :dash, linewidth = 3) # np. linia teoretyczna i zaszumione dane

# + grubość linii Out[54]:

(20)

Rodzaje punktów

Atrybuty markers, markersize, markercolor,markerstrokewidth,markerstrokecolor In [58]: plot(Plots.fakedata(50,1), linecolor = :green) # fałszywe dane do prezentacji

Out[58]:

In [67]: scatter(1:10,rand(0:20,10), markers = :square, markersize = 10,

markercolor = :yellow, markerstrokewidth = 4, markerstrokecolor = :red )

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(21)

Zmiany skali

Funkcje, które szybko zanikają lub rosną, nie są dobrze widoczne w standardowej skali. Ważną inżynierską umiejętnością jest właściwy dobór skali do obserwowanej zależności.

Składnia:

yscale = :log10, xscale = :log10 Są też inne skale, ale są mniej ważne.

Co daje zmiana skali:

Niech

wtedy Out[67]:

y= A exp(Bx)

log(y) = Bx + log(A)

(22)

Niech b a

In [69]: plot(exp,-5,3)

Out[69]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(23)

In [70]: plot(exp,-5,3, yscale = :log10) # linia prosta, współczynnik kierunkowy = 1, bo to exp(1*x)

Out[70]:

In [72]: plot(x-> exp(-2x),-5,3, yscale = :log10) # wsp. kierunkowy = -2

Out[72]:

(24)

In [73]: plot(x-> x^2.5,0,5)

Out[73]:

In [77]: plot(x-> 3x^2.5,0.001,5, xscale=:log10,yscale=:log10) # wsp. kierunkowy to log10(2.5), przebici

Out[77]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(25)

In [79]: plot(x->1/(exp(x)+1),-5,15)

Out[79]:

In [80]: plot(x->1/(exp(x)+1),-5,15, yscale = :log10) # wykładnicza dla dużych x, dokładnie jak exp(-x)

Out[80]:

(26)

In [82]: plot(x->exp(x) + 1, -2,2, yscale= :log10) # nie działa, to nie funkcja Aexp(Bx)

Out[82]:

In [84]: # trzeba znaleźć parametr + C i go odjąć

plot(x->exp(x) + 1 - 1, -2,2, yscale= :log10)

Out[84]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(27)

In [85]: plot(x-> exp(-x) + 4, 0, 10) # z dużych x sczytujemy + 4

Out[85]:

In [86]: plot(x-> exp(-x) + 4 - 4, 0, 10, yscale = :log10)

Out[86]:

(28)

xlim = (a,b), ylim = (c,d)

Właściwy dobór zakresu ma duże znaczenie dla oddania zmienności!

In [123… xs = LinRange(-10,10,500) ys = tan.(xs)

plot(xs,ys)

Out[123…

−10 −5 0 5 10

−300

−200

−100 0 100 200 300

y1

In [89]: plot(xs,ys, xlim = (-pi,pi), ylim = (-5,5)) # mniejszy zakres - dużo wyraźniej

# linie są połączone, a nie powinny

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(29)

Out[89]:

In [124… # łączenie linii możemy wyłączyć wstawiając NaN

ys[abs.(ys).> 20] .= NaN # wycinamy duże wartości

plot(xs,ys, xlim = (-pi,pi), ylim = (-5,5)) # już nie łączy linii

Out[124…

0.0 2.5 5.0

y1

(30)

Osie wykresu

In [94]: plot(1:10, rand([100, 101],10)) # widzimy dużą zmienność, bo zakres jest od 100 do 101

Out[94]:

In [95]: plot(1:10, rand([100, 101],10), ylim=(0,101)) # tym razem porównujemy zmienność do wartości y,

Out[95]:

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(31)

Składania:

atrybut framestyle , opcje :box, :semi, :origin, :zerolines, :grid, :none .

In [96]: plot(sin,-pi,pi, framestyle = :grid)

Out[96]:

In [97]: plot(sin,-pi,pi, framestyle = :zerolines)

(32)

Tekst i komentarze

Wykres należy opisać, obowiązkowe są podpisy osi oraz jednostki.

label - podpis linii xlabel - podpis osi x ylabel - podpis osi y title - tytuł wykresu

annotations, annotate! - dodatkowe komentarze Out[97]:

In [98]: p = plot( # pusty wykres framestyle = :none, xlim = (0,1),

ylim = (0,1) )

for k in 1:500 annotate!(

rand(),rand(), # losowe pozycje text(

rand('a':'z'), # losowa litera

rand([:blue,:pink,:red,:green,:yellow,:orange,:violet,:cyan]) # losowy kolor )

) end

p |> display

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(33)

In [100… plot(x-> sin(x)^2 + cos(3x), -2pi,2pi, xlabel = "t",

ylabel = "funkcja trygonometryczna", label = "sin(x)^2 + cos(3x)",

title = "nie mam pomysłu"

) Out[100…

(34)

Jako że zajmujemy się matematyką, często w podpisach wykresów będą się pojawiać wyrażenia matematyczne. Julia obsługuje unicode, więc sporo można uzyskać bezpośrednio; potrzebujemy tylko czcionki, która obsługuje potrzebne znaki

In [101… # szeroki zestaw znaków oferuje PyPlot, więc się na niego przełączmy

pyplot()

plot(x->x^2+5x+6, -3.5,-1.5, title = "x²+5x+6, Δ = 1", label = "parabola"

)

scatter!([-3],[0],

label = "x₁=(-5+√Δ)/2"

)

scatter!([-2],[0],

label = "x₂ = (5+√Δ)/2", legend = :bottomright )

Out[101…

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(35)

Pakiet LaTeXStrings umożliwia używanie LaTeXa w wykresach. Wystarczy użyć składni L"

tekst $równanie$"

In [102… gr() # też dobrze, ale trzeba uważać - zależy od dostępności czcionek

plot(x->x^2+5x+6, -3.5,-1.5, title = "x²+5x+6, Δ = 1", label = "parabola"

)

scatter!([-3],[0],

label = "x₁=(-5+√Δ)/2"

)

scatter!([-2],[0],

label = "x₂ = (5+√Δ)/2", legend = :bottomright )

Out[102…

(36)

Wykresy 3D

Krzywe

Krzywe są obiektami jednowymiarowymi. W związku z tym jej naturalnym opisem jest podanie 3 krzywych jednowymiarowych, odpowiadających kolejnym współrzędnym.

In [104… using LaTeXStrings

pyplot() # gr() nie działa plot([x->1/x, log],1,5,

title = L"fact: $\int_1^x \frac{d y}{y}= \ln(x)$", labels = [L"\frac{1}{x}" L"\ln(x)"],

xlabel = L"x", ylabel = L"y", annotation = (

4,1,

text(L"additionally: $\ln(x) = 2\ln\sqrt{x}$",:green) )

) Out[104…

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(37)

┌ Info: For saving to png with the Plotly backend PlotlyBase has to be install ed.

└ @ Plots C:\Users\jakub\.julia\packages\Plots\SjqWU\src\backends.jl:372 In [106… plotly() # najbezpieczniej plotly

t = LinRange(-20,20,10^4) xs = @. (5+sin(100t))*cos(t) ys = @. (5+sin(100t))*sin(t) zs = @. (5+cos(100t)) + 5t plot(xs,ys,zs,

xlabel = "x", ylabel = "y", zlabel = "z", label=""

)

Out[106…

In [107… plot(cos,sin,cos,-pi,pi) # funkcyjnie, x = x(t), y = y(t), z = z(t)

Out[107…

y1

(38)

Powierzchnie

Powierzchnie są obiektami 2 wymiarowymi zawieszonymi w 3D. W związku z tym zapisanie ich w postaci 1 wymiarowych tablic jest kłopotliwe (choć możliwe). Wygodniej jest używać macierzy.

Składania:

surface(xs,ys,zs,opcje)

zs - tablica z zetami o współrzędnych odpowiadających tym w xs oraz ys Również

surface(xs,ys,f::Function,opcje) f - funkcja 2 zmiennych

Oprócz tego:

contour - rysuje poziomice

countourf - rysuje wypełnione poziomice heatmap - rysuje wartości komórek bez poziomic

Komenda surface jest efektowna, ale countourf często czytelniejszy!

500×500 Matrix{Float64}:

1.22465e-16 1.22455e-16 1.22426e-16 … 1.22455e-16 1.22465e-16 0.0125912 0.0125902 0.0125872 0.0125902 0.0125912 0.0251804 0.0251784 0.0251725 0.0251784 0.0251804 0.0377657 0.0377627 0.0377537 0.0377627 0.0377657 0.0503449 0.0503409 0.050329 0.0503409 0.0503449 0.0629162 0.0629112 0.0628962 … 0.0629112 0.0629162 0.0754775 0.0754715 0.0754535 0.0754715 0.0754775 0.0880268 0.0880198 0.0879989 0.0880198 0.0880268 0.100562 0.100554 0.10053 0.100554 0.100562 0.113082 0.113073 0.113046 0.113073 0.113082 0.125583 0.125573 0.125543 … 0.125573 0.125583 0.138065 0.138054 0.138021 0.138054 0.138065 0.150524 0.150512 0.150477 0.150512 0.150524 In [108… xs = LinRange(-pi,pi, 500)

ys = LinRange(-pi,pi, 500)' # poziomo zs = sin.(xs) .* cos.(ys)

Out[108…

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(39)

⋮ ⋱

-0.138065 -0.138054 -0.138021 -0.138054 -0.138065 -0.125583 -0.125573 -0.125543 -0.125573 -0.125583 -0.113082 -0.113073 -0.113046 … -0.113073 -0.113082 -0.100562 -0.100554 -0.10053 -0.100554 -0.100562 -0.0880268 -0.0880198 -0.0879989 -0.0880198 -0.0880268 -0.0754775 -0.0754715 -0.0754535 -0.0754715 -0.0754775 -0.0629162 -0.0629112 -0.0628962 -0.0629112 -0.0629162 -0.0503449 -0.0503409 -0.050329 … -0.0503409 -0.0503449 -0.0377657 -0.0377627 -0.0377537 -0.0377627 -0.0377657 -0.0251804 -0.0251784 -0.0251725 -0.0251784 -0.0251804 -0.0125912 -0.0125902 -0.0125872 -0.0125902 -0.0125912 -1.22465e-16 -1.22455e-16 -1.22426e-16 -1.22455e-16 -1.22465e-16 In [110… surface(xs,ys',zs) # x oraz y pionowo albo wektory 1D

Out[110…

−1

−0.5 0 0.5 1

In [111… contour(xs,ys',zs)

Out[111…

2 3

0.8

(40)

In [112… contourf(xs,ys',zs)

Out[112…

−3 −2 −1 0 1 2 3

−3

−2

−1 0 1 2 3

−0.8

−0.4 0 0.4 0.8

In [113… heatmap(xs,ys',zs) # bez konturów

Out[113…

−1 0 1 2 3

−0.5 0 0.5 1

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

(41)

In [114… # atrybut levels - liczba lub lista poziomic

contourf(xs,ys',zs, levels = 20) # więcej

Out[114…

−3 −2 −1 0 1 2 3

−3

−2

−1 0 1 2 3

−1

−0.5 0 0.5 1

In [ ]:

In [121… # można też zmieniać gradient barw, cgrad

heatmap(xs,ys',zs, c = cgrad(:blues))

Out[121…

3 1

(42)

In [ ]: # własne skale barw

Temat 5-1 http://localhost:8888/nbconvert/html/Temat 5-1.ipynb?download=false

Obraz

Updating...

Cytaty

Powiązane tematy :