diff --git a/.github/workflows/Documenter.yml b/.github/workflows/Documenter.yml index 8f743c08..3a16d229 100644 --- a/.github/workflows/Documenter.yml +++ b/.github/workflows/Documenter.yml @@ -49,7 +49,7 @@ jobs: - name: Install documentation dependencies # for GLMakie plots run: sudo apt-get update && sudo apt-get install -y xorg-dev mesa-utils xvfb libgl1 freeglut3-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev - name: Install documentation dependencies - run: DISPLAY=:0 xvfb-run -s '-screen 0 1024x768x24' julia --project=docs -e 'using Pkg; pkg"add https://github.com/LuxDL/DocumenterVitepress.jl.git"; pkg"dev ."; pkg"add DimensionalData#main"; Pkg.instantiate(); Pkg.precompile(); Pkg.status()' + run: DISPLAY=:0 xvfb-run -s '-screen 0 1024x768x24' julia --project=docs -e 'using Pkg; pkg"dev ."; Pkg.instantiate(); Pkg.precompile(); Pkg.status()' - name: Instantiate NPM run: cd docs/; npm i; cd .. #- name: Creating new mds from src diff --git a/.gitignore b/.gitignore index 42d4f85c..5a1f0de7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ Manifest.toml - +.DS_Store *.jl.cov *.jl.*.cov *.jl.mem @@ -7,26 +7,18 @@ tmp generated build .vscode -.DS_Store *.zarr *.nc var -docs/docs -docs/site -docs/build -docs/var -deps/build.jl -bonito - *.ipynb_checkpoints # Ignore the benchmarking results /benchmark/*.json .benchmarkci coverage/lcov.info -node_modules -docs/node_modules +bonito +docs/build .DS_Store docs/src/.vitepress/cache docs/src/.vitepress/dist @@ -35,4 +27,4 @@ docs/.vscode docs/node_modules docs/.vitepress/cache docs/.vitepress/dist -docs/.DS_Store +docs/.DS_Store \ No newline at end of file diff --git a/Project.toml b/Project.toml index 799ad28a..d4a522cd 100644 --- a/Project.toml +++ b/Project.toml @@ -34,7 +34,7 @@ YAXArrayBase = "90b8fcef-0c2d-428d-9c56-5f86629e9d14" [compat] CFTime = "0.0, 0.1" DataStructures = "0.17, 0.18" -DimensionalData = "0.24, 0.25" +DimensionalData = "0.24, 0.25, 0.26" DiskArrayTools = "0.1" DiskArrays = "0.3,0.4" DocStringExtensions = "0.8, 0.9" diff --git a/docs/contributors.jl b/docs/contributors.jl new file mode 100644 index 00000000..61effd54 --- /dev/null +++ b/docs/contributors.jl @@ -0,0 +1,20 @@ +using GitHub + +function getavatars(; n = 90) + contri = GitHub.contributors("JuliaDataCubes/YAXArrays.jl")[1] + avatars = [] + contributions = [] + urls = [] + for i in eachindex(contri) + push!(avatars, contri[i]["contributor"].avatar_url.uri) + push!(contributions, contri[i]["contributions"]) + push!(urls, contri[i]["contributor"].html_url.uri) + end + p = sortperm(contributions, rev=true) + return avatars[p], urls[p] +end + +avatars, urls = getavatars(; n = 90) +for (i,a) in enumerate(avatars) + println("""""") +end \ No newline at end of file diff --git a/docs/logo.jl b/docs/logo.jl new file mode 100644 index 00000000..75c95e71 --- /dev/null +++ b/docs/logo.jl @@ -0,0 +1,4 @@ +using GLMakie.Colors +using GLMakie +using Random +Random.seed!(13) \ No newline at end of file diff --git a/docs/make.jl b/docs/make.jl index e6fe2441..969db09e 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,7 +1,5 @@ using Documenter using DocumenterVitepress -# add https://github.com/LuxDL/DocumenterVitepress.jl.git -# add DimensionalData#main using YAXArrays makedocs(; sitename="YAXArrays.jl", @@ -9,54 +7,20 @@ makedocs(; sitename="YAXArrays.jl", modules=[YAXArrays], warnonly = true, checkdocs=:all, - format=DocumenterVitepress.MarkdownVitepress(), + format=DocumenterVitepress.MarkdownVitepress( + repo = "github.com/JuliaDataCubes/YAXArrays.jl", # this must be the full URL! + devbranch = "master", + devurl = "dev"; + ), draft=false, source="src", - build=joinpath(@__DIR__, "build") + build= "build", ) - # To edit the sidebar, you must edit `docs/src/.vitepress/config.mts`. -# We manually obtain the Documenter deploy configuration, -# so we can use it to set Vitepress's settings. -# TODO: make this better / encapsulate it in `makedocs` -# so the user does not need to know! -deploy_config = Documenter.auto_detect_deploy_system() -deploy_decision = Documenter.deploy_folder( - deploy_config; - repo="github.com/JuliaDataCubes/YAXArrays.jl.git", # this must be the full URL! - devbranch="master", - devurl = "dev", - push_preview=true, -) - -# VitePress relies on its config file in order to understand where files will exist. -# We need to modify this file to reflect the correct base URL, however, Documenter -# only knows about the base URL at the time of deployment. - -# So, after building the Markdown, we need to modify the config file to reflect the -# correct base URL, and then build the VitePress site. -folder = deploy_decision.subfolder -println("Deploying to $folder") -vitepress_config_file = joinpath(@__DIR__, "build", ".vitepress", "config.mts") -config = read(vitepress_config_file, String) -new_config = replace( - config, - "base: 'REPLACE_ME_WITH_DOCUMENTER_VITEPRESS_BASE_URL_WITH_TRAILING_SLASH'" => "base: '/YAXArrays.jl/$(folder)$(isempty(folder) ? "" : "/")'" -) -write(vitepress_config_file, new_config) - -# Build the docs using `npm` - we are assuming it's installed here! -haskey(ENV, "CI") && begin - cd(@__DIR__) do - run(`npm run docs:build`) - end - touch(joinpath(@__DIR__, "build", ".vitepress", "dist", ".nojekyll")) -end - deploydocs(; repo="github.com/JuliaDataCubes/YAXArrays.jl.git", # this must be the full URL! - target="build/.vitepress/dist", # this is where Vitepress stores its output + target="build", # this is where Vitepress stores its output branch = "gh-pages", devbranch="master", push_preview = true diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index 9a8f480d..00000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,128 +0,0 @@ -theme: - name: material - logo: assets/logo.png - features: - - content.code.copy - # - announce.dismiss - - content.code.annotate - # - content.tabs.link - #- content.tooltips - # - header.autohide - # - navigation.expand - #- navigation.indexes - # - navigation.instant - # - navigation.prune - #- navigation.sections - #- navigation.tabs - # - navigation.tabs.sticky - - navigation.top - - navigation.footer - #- navigation.tracking - - search.highlight - - search.share - - search.suggest - - toc.follow - #- toc.integrate # Table of contents is integrated on the left; does not appear separately on the right. - - header.autohide # header disappears as you scroll - palette: - # Light mode / dark mode - # We deliberately don't automatically use `media` to check a user's preferences. We default to light mode as - # (a) it looks more professional, and (b) is more obvious about the fact that it offers a (dark mode) toggle. - - scheme: default - primary: blue - accent: amber - toggle: - icon: material/lightbulb - name: Switch to dark mode - - scheme: slate - primary: black - accent: amber - toggle: - icon: material/lightbulb-outline - name: Switch to light mode - font: - text: Lato - icon: - repo: fontawesome/brands/github # GitHub logo in top right - #logo: "material/gridoff" # Equinox logo in top left - # favicon: "_static/icon_transparent.svg" - custom_dir: "_overrides" # Overriding part of the HTML - - # These additions are my own custom ones, having overridden a partial. - #twitter_name: "@lazarusAlon" - #twitter_url: "https://twitter.com/lazarusAlon" -site_name: YAXArrays -site_description: Yet Another XArray-like Julia Package -site_author: Lazaro Alonso -site_url: "" - -repo_url: https://github.com/JuliaDataCubes/YAXArrays.jl -repo_name: YAXArrays -edit_uri: "" # No edit button, as some of our pages are in /docs and some in /examples via symlink, so it's impossible for them all to be accurate - -strict: true # Don't allow warnings during the build process -extra_javascript: - # The below three make MathJax work, see https://squidfunk.github.io/mkdocs-material/reference/mathjax/ - - _static/mathjax.js - - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - -extra_css: - - stylesheets/custom.css -extra_javascript: - - javascripts/mathjax.js - - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - -markdown_extensions: - - admonition - - toc: - permalink: "¤" # Adds a clickable permalink to each section heading - toc_depth: 4 - - pymdownx.arithmatex: # Render LaTeX via MathJax - generic: true - - pymdownx.details # Allowing hidden expandable regions denoted by ??? - - pymdownx.highlight - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.superfences # Seems to enable syntax highlighting when used with the Material theme. - - pymdownx.tasklist: - custom_checkbox: true - - def_list - - pymdownx.tabbed: - alternate_style: true - - attr_list - - md_in_html -plugins: - - search # default search plugin; needs manually re-enabling when using any other plugins - - autorefs # Cross-links to headings - - include_exclude_files: - exclude: - - "_overrides" -# - mknotebooks # Jupyter notebooks - - mkdocs-video -nav: - - "Home": "index.md" - #- "User Guide": - - "Switch to DimensionalData": "examples/generated/HowdoI/switchtodimarray.md" - - "Creating YAXArrays and Datasets" : "examples/generated/UserGuide/creating.md" - - "Saving YAXArrays and Datasets" : "examples/generated/UserGuide/saving.md" - - "Setting chunks's size": "examples/generated/UserGuide/setchuncks.md" - - "Indexing and subsetting": "examples/generated/UserGuide/indexing_subsetting.md" - - "Apply functions on YAXArrays": "examples/generated/UserGuide/applyfunctions.md" - - "Generate a cube from function": "examples/generated/UserGuide/create_from_func.md" - - "Open NetCDF" : "examples/generated/UserGuide/openNetCDF.md" - - "Open Zarr (Store)" : "examples/generated/UserGuide/openZarr.md" - - "Distributed processes" : "examples/generated/UserGuide/distributed.md" - #- "Gallery": - - "Simple maps": "examples/generated/Gallery/simplemaps.md" - #- "Tutorials": - - "Tutorial": "tutorials/tutorial.md" - - "How do I ...": "examples/generated/HowdoI/howdoi.md" - #- "Examples from ESDL study 1": "examples/generated/UserGuide/examples_from_esdl_study_1.md" - #- "Examples from ESDL study 2": "examples/generated/UserGuide/examples_from_esdl_study_2.md" - #- "Examples from ESDL study 3": "examples/generated/UserGuide/examples_from_esdl_study_3.md" - #- "Examples from ESDL study 4": "examples/generated/UserGuide/examples_from_esdl_study_4.md" - - - "Contribute to docs": "examples/generated/contribute/contribute.md" - - "API" : "api.md" \ No newline at end of file diff --git a/docs/package.json b/docs/package.json index 376a4f7f..f908fde5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,8 +1,8 @@ { "scripts": { - "docs:dev": "vitepress dev build", - "docs:build": "vitepress build build", - "docs:preview": "vitepress preview build" + "docs:dev": "vitepress dev build/.documenter", + "docs:build": "vitepress build build/.documenter", + "docs:preview": "vitepress preview build/.documenter" }, "devDependencies": { "markdown-it": "^14.0.0", diff --git a/docs/src/.vitepress/config.mts b/docs/src/.vitepress/config.mts index 0108cdea..ecbd8e84 100644 --- a/docs/src/.vitepress/config.mts +++ b/docs/src/.vitepress/config.mts @@ -4,11 +4,12 @@ import mathjax3 from "markdown-it-mathjax3"; // https://vitepress.dev/reference/site-config export default defineConfig({ - base: 'REPLACE_ME_WITH_DOCUMENTER_VITEPRESS_BASE_URL_WITH_TRAILING_SLASH', + base: 'REPLACE_ME_DOCUMENTER_VITEPRESS', title: "YAXArrays.jl", description: "Yet another xarray-like Julia package", lastUpdated: true, cleanUrls: true, + outDir: 'REPLACE_ME_DOCUMENTER_VITEPRESS', // This is required for MarkdownVitepress to work correctly... ignoreDeadLinks: true, markdown: { @@ -42,6 +43,7 @@ export default defineConfig({ { text: 'Setting chunks size', link: '/UserGuide/setchuncks' }, { text: 'Apply functions on YAXArrays', link: '/UserGuide/applyfunctions' }, { text: 'Create Cube from function', link: '/UserGuide/create_cube_from_function' }, + { text: 'Group by', link: '/UserGuide/group_by' }, { text: 'Distributed computing', link: '/UserGuide/distributed' }, { text: 'Open NetCDF', link: '/UserGuide/openNetCDF' }, { text: 'Open Zarr (Store)', link: '/UserGuide/openZarr' }, @@ -51,13 +53,20 @@ export default defineConfig({ { text: 'Overview', link: '/tutorials/tutorial' }, { text: 'Plotting maps', link: '/tutorials/plottingmaps' }, { text: 'Mean Seasonal Cycle', link: '/tutorials/mean_seasonal_cycle' }, - { text: 'ESDL study 3', link: '/tutorials/examples_from_esdl_study_3' }, - { text: 'ESDL study 4', link: '/tutorials/examples_from_esdl_study_4' }, + { text: 'ESDL studies', + items: [ + { text: 'ESDL study 1', link: '/tutorials/esdl/examples_from_esdl_study_1' }, + { text: 'ESDL study 2', link: '/tutorials/esdl/examples_from_esdl_study_2' }, + { text: 'ESDL study 3', link: '/tutorials/esdl/examples_from_esdl_study_3' }, + { text: 'ESDL study 4', link: '/tutorials/esdl/examples_from_esdl_study_4' }, + ] + }, ]}, { text: 'How do I?', items: [ { text: 'How do I ...', link: '/HowdoI/howdoi' }, - { text: 'Contribute to docs', link: '/HowdoI/contribute' } + { text: 'Contribute to docs', link: '/HowdoI/contribute' }, + { text: 'Contributors', link: '/contributors' } ]}, ], @@ -71,6 +80,7 @@ export default defineConfig({ { text: 'Setting chunks size', link: '/UserGuide/setchuncks' }, { text: 'Apply functions on YAXArrays', link: '/UserGuide/applyfunctions' }, { text: 'Create Cube from function', link: '/UserGuide/create_cube_from_function' }, + { text: 'Group by', link: '/UserGuide/group_by' }, { text: 'Distributed computing', link: '/UserGuide/distributed' }, { text: 'Open NetCDF', link: '/UserGuide/openNetCDF' }, { text: 'Open Zarr (Store)', link: '/UserGuide/openZarr' }, @@ -79,21 +89,22 @@ export default defineConfig({ items: [ { text: 'Overview', link: '/tutorials/tutorial' }, { text: 'Plotting maps', link: '/tutorials/plottingmaps' }, - { text: 'Mean Seasonal Cycle', link: '/tutorials/mean_seasonal_cycle' }, - { text: 'ESDL study 3', link: '/tutorials/examples_from_esdl_study_3' }, - { text: 'ESDL study 4', link: '/tutorials/examples_from_esdl_study_4' }, + { text: 'Mean Seasonal Cycle', link: '/tutorials/mean_seasonal_cycle' } ]}, { text: 'How do I?', items: [ { text: 'How do I ...', link: '/HowdoI/howdoi' }, - { text: 'Contribute to docs', link: '/HowdoI/contribute' } + { text: 'Contribute to docs', link: '/HowdoI/contribute' }, ]}, + { text: 'Contributors', link: '/contributors' }, { text: 'API', items: [ { text: 'API Reference', link: 'api' }, ]}, ], - + editLink: { + pattern: 'https://github.com/JuliaDataCubes/YAXArrays.jl/edit/master/docs/src/:path' + }, socialLinks: [ { icon: 'github', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl' } ], diff --git a/docs/src/.vitepress/theme/style.css b/docs/src/.vitepress/theme/style.css index 83967bdd..cbc881a0 100644 --- a/docs/src/.vitepress/theme/style.css +++ b/docs/src/.vitepress/theme/style.css @@ -1,26 +1,53 @@ -@import url(https://fonts.googleapis.com/css?family=Space+Mono:regular,italic,700,700italic); -@import url(https://fonts.googleapis.com/css?family=Space+Grotesk:regular,italic,700,700italic); - -/** - * Customize default theme styling by overriding CSS variables: - * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css +/* Customize default theme styling by overriding CSS variables: +https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */ -/** - * Fonts - * -------------------------------------------------------------------------- - */ -:root { + /* Layouts */ + +/* + :root { + --vp-layout-max-width: 1440px; +} */ + +.VPHero .clip { + white-space: pre; + max-width: 500px; +} + +/* Fonts */ + +@font-face { + font-family: JuliaMono-Regular; + src: url("https://cdn.jsdelivr.net/gh/cormullion/juliamono/webfonts/JuliaMono-Regular.woff2"); +} + + :root { /* Typography */ - --vp-font-family-base: "Space Grotesk", "Inter var experimental", "Inter var", + --vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; /* Code Snippet font */ - --vp-font-family-mono: "Space Mono", Menlo, Monaco, Consolas, "Courier New", - monospace; + --vp-font-family-mono: JuliaMono-Regular, monospace; + +} + +.mono { + /* + Disable contextual alternates (kind of like ligatures but different) in monospace, + which turns `/>` to an up arrow and `|>` (the Julia pipe symbol) to an up arrow as well. + This is pretty bad for Julia folks reading even though copy+paste retains the same text. + */ + font-feature-settings: 'calt' 0; + pre { + font-family: JuliaMono-Light; +}; +code { + font-family: JuliaMono-Light; + }; } + /** * Colors For inspiration visit diff --git a/docs/src/UserGuide/group_by.md b/docs/src/UserGuide/group_by.md new file mode 100644 index 00000000..b63787cb --- /dev/null +++ b/docs/src/UserGuide/group_by.md @@ -0,0 +1,204 @@ +# GroupBy + +The following examples will use the `groupby` function to calculate temporal and spatial averages. + +````@example compareXarray +using YAXArrays, DimensionalData +using NetCDF +using Downloads +using Dates +using Statistics +```` + +### Seasonal Averages from Time Series of Monthly Means + +The following reproduces the example in [xarray](https://docs.xarray.dev/en/stable/examples/monthly-means.html) by [Joe Hamman](https://github.com/jhamman/). + +Where the goal is to calculate the seasonal average. And in order to do this properly, is necessary to calculate the weighted average considering that each month has a different number of days. + +### Download the data + +````@example compareXarray +url_path = "https://github.com/pydata/xarray-data/raw/master/rasm.nc" +filename = Downloads.download(url_path, "rasm.nc") +ds_o = Cube(filename) +nothing # hide +```` + +::: warning + +The following rebuild should not be necessary in the future, plus is unpractical to use for large data sets. Out of memory groupby currently is work in progress. +Related to https://github.com/rafaqz/DimensionalData.jl/issues/642 + +::: + +````@example compareXarray + +axs = dims(ds_o) # get the dimensions +data = ds_o.data[:,:,:] # read the data +_FillValue = ds_o.properties["_FillValue"] +data = replace(data, _FillValue => NaN) +# create new YAXArray +ds = YAXArray(axs, data) +nothing # hide +```` + +## GroupBy: seasons + +::: details function weighted_seasons(ds) ... end + +````julia +function weighted_seasons(ds) + # calculate weights + tempo = dims(ds, :Ti) + month_length = YAXArray((tempo,), daysinmonth.(tempo)) + g_tempo = groupby(month_length, Ti => seasons(; start=December)) + sum_days = sum.(g_tempo, dims=:Ti) + weights = map(./, g_tempo, sum_days) + # unweighted seasons + g_ds = groupby(ds, Ti => seasons(; start=December)) + mean_g = mean.(g_ds, dims=:Ti) + mean_g = dropdims.(mean_g, dims=:Ti) + # weighted seasons + g_dsW = broadcast_dims.(*, weights, g_ds) + weighted_g = sum.(g_dsW, dims = :Ti); + weighted_g = dropdims.(weighted_g, dims=:Ti) + # differences + diff_g = map(.-, weighted_g, mean_g) + seasons_g = lookup(mean_g, :Ti) + return mean_g, weighted_g, diff_g, seasons_g +end +```` +::: + +Now, we continue with the `groupby` operations as usual + +````@ansi compareXarray +g_ds = groupby(ds, Ti => seasons(; start=December)) +```` + +And the mean per season is calculated as follows + +````@ansi compareXarray +mean_g = mean.(g_ds, dims=:Ti) +```` + +### dropdims + +Note that now the time dimension has length one, we can use `dropdims` to remove it + +````@ansi compareXarray +mean_g = dropdims.(mean_g, dims=:Ti) +```` + +### seasons + +Due to the `groupby` function we will obtain new grouping names, in this case in the time dimension: + +````@example compareXarray +seasons_g = lookup(mean_g, :Ti) +```` + +Next, we will weight this grouping by days/month in each group. + +## GroupBy: weight + +Create a `YAXArray` for the month length + +````@example compareXarray +tempo = dims(ds, :Ti) +month_length = YAXArray((tempo,), daysinmonth.(tempo)) +```` + +Now group it by season + +````@ansi compareXarray +g_tempo = groupby(month_length, Ti => seasons(; start=December)) +```` + +Get the number of days per season + +````@ansi compareXarray +sum_days = sum.(g_tempo, dims=:Ti) +```` + +### weights + +Weight the seasonal groups by `sum_days` + +````@ansi compareXarray +weights = map(./, g_tempo, sum_days) +```` + +Verify that the sum per season is 1 + +````@ansi compareXarray +sum.(weights) +```` +### weighted seasons + +Now, let's weight the seasons + +````@ansi compareXarray +g_dsW = broadcast_dims.(*, weights, g_ds) +```` + +apply a `sum` over the time dimension and drop it + +````@ansi compareXarray +weighted_g = sum.(g_dsW, dims = :Ti); +weighted_g = dropdims.(weighted_g, dims=:Ti) +```` + +Calculate the differences + +````@ansi compareXarray +diff_g = map(.-, weighted_g, mean_g) +```` + +All the previous steps are equivalent to calling the function defined at the top: + +````julia +mean_g, weighted_g, diff_g, seasons_g = weighted_seasons(ds) +```` + +Once all calculations are done we can plot the results with `Makie.jl` as follows: + +````@example compareXarray +using CairoMakie +# define plot arguments/attributes +colorrange = (-30,30) +colormap = Reverse(:Spectral) +highclip = :red +lowclip = :grey15 +cb_label = ds_o.properties["long_name"] +```` + +````@example compareXarray +with_theme(theme_ggplot2()) do + hm_o, hm_d, hm_w = nothing, nothing, nothing + # the figure + fig = Figure(; size = (850,500)) + axs = [Axis(fig[i,j], aspect=DataAspect()) for i in 1:3, j in 1:4] + for (j, s) in enumerate(seasons_g) + hm_o = heatmap!(axs[1,j], mean_g[Ti=At(s)]; colorrange, lowclip, highclip, colormap) + hm_w = heatmap!(axs[2,j], weighted_g[Ti=At(s)]; colorrange, lowclip, highclip, colormap) + hm_d = heatmap!(axs[3,j], diff_g[Ti=At(s)]; colorrange=(-0.1,0.1), lowclip, highclip, + colormap=:diverging_bwr_20_95_c54_n256) + end + Colorbar(fig[1:2,5], hm_o, label=cb_label) + Colorbar(fig[3,5], hm_d, label="Tair") + hidedecorations!.(axs, grid=false, ticks=false, label=false) + # some labels + [axs[1,j].title = string.(s) for (j,s) in enumerate(seasons_g)] + Label(fig[0,1:5], "Seasonal Surface Air Temperature", fontsize=18, font=:bold) + axs[1,1].ylabel = "Unweighted" + axs[2,1].ylabel = "Weighted" + axs[3,1].ylabel = "Difference" + colgap!(fig.layout, 5) + rowgap!(fig.layout, 5) + fig +end +```` + +which shows a good agreement with the results first published by [Joe Hamman](https://github.com/jhamman/). \ No newline at end of file diff --git a/docs/src/public/logo.png b/docs/src/assets/logo.png similarity index 100% rename from docs/src/public/logo.png rename to docs/src/assets/logo.png diff --git a/docs/src/public/logo.svg b/docs/src/assets/logo.svg similarity index 100% rename from docs/src/public/logo.svg rename to docs/src/assets/logo.svg diff --git a/docs/src/components/AsideTrustees.vue b/docs/src/components/AsideTrustees.vue index 67989e03..836a6a86 100644 --- a/docs/src/components/AsideTrustees.vue +++ b/docs/src/components/AsideTrustees.vue @@ -1,6 +1,6 @@