Skip to content
Open
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ba6f420
Add draft of JN for numpy - array, datatime
yvonnefroehlich Jan 4, 2025
c0b903b
Include output figure
yvonnefroehlich Jan 4, 2025
248a5bd
Reduce resolution of output image in JN
yvonnefroehlich Jan 4, 2025
414c8b8
Include GMT.jl
yvonnefroehlich Jan 5, 2025
c73b38b
Add CSV files [temporary for reference]
yvonnefroehlich Jan 5, 2025
b46752c
Adjust filename
yvonnefroehlich Jan 5, 2025
2150e2a
Reduce resolution of output image in JN
yvonnefroehlich Jan 5, 2025
e525ea6
Fix date in filename
yvonnefroehlich Feb 11, 2025
7434785
Add plot for aligned time series
yvonnefroehlich Apr 23, 2025
9d3fb0d
Update star history data | Reade data from file | Reduce code via loo…
yvonnefroehlich Oct 17, 2025
80cf207
Remove wrong data point
yvonnefroehlich Oct 17, 2025
40bb6ce
Remove unneeded import of numpy
yvonnefroehlich Nov 5, 2025
6853dce
Use upper-case letter for y label
yvonnefroehlich Nov 5, 2025
9188574
Extend x-axis in negative direction to avoid no_clip=True
yvonnefroehlich Nov 5, 2025
37d95e3
Add a box around the legend
yvonnefroehlich Nov 5, 2025
8b22b2f
Remove using no_clip parameter
yvonnefroehlich Nov 5, 2025
abcc381
Fix file
yvonnefroehlich Nov 5, 2025
2550708
Remove date from files for star history
yvonnefroehlich Nov 5, 2025
305321c
Make legend box look nice and use Box class
yvonnefroehlich Nov 5, 2025
331718c
Move to normal python script (temporaly)
yvonnefroehlich Nov 5, 2025
c0ef9ed
Rename files and save output figure
yvonnefroehlich Nov 12, 2025
2ee2822
Merge remote-tracking branch 'origin/main' into fig/numpy
yvonnefroehlich Nov 16, 2025
29a78d5
Adjust figure number
yvonnefroehlich Nov 21, 2025
3118402
Adjust annotations for y axis
yvonnefroehlich Nov 21, 2025
7ab6240
Update starts data csv files
yvonnefroehlich Nov 21, 2025
6aafdce
Update starts data csv files
yvonnefroehlich Nov 21, 2025
38d582d
Add gmtmex
yvonnefroehlich Nov 21, 2025
268dd4b
Sort by starting time of project
yvonnefroehlich Nov 21, 2025
38b04a2
Follow coding style
yvonnefroehlich Nov 27, 2025
81891b2
Merge remote-tracking branch 'origin/main' into fig/numpy
yvonnefroehlich Nov 27, 2025
f9ff990
Merge remote-tracking branch 'origin/main' into fig/numpy
yvonnefroehlich Nov 27, 2025
caa4edc
merge remote-tracking branch 'origin/main' into fig/numpy
yvonnefroehlich Nov 30, 2025
fd86eb7
Import Box class
yvonnefroehlich Nov 30, 2025
79389d5
Fix RGB codes for colors
yvonnefroehlich Dec 1, 2025
c144d8c
Use different symbols
yvonnefroehlich Dec 1, 2025
2e8a472
Test requesting github stars data via Dongdong's code
yvonnefroehlich Dec 1, 2025
73ea374
Merge remote-tracking branch 'origin/main' into fig/numpy
yvonnefroehlich Dec 1, 2025
0018c93
Reorder based y value of laster record
yvonnefroehlich Dec 1, 2025
3da5bff
Adjust color for MATLAB
yvonnefroehlich Dec 2, 2025
8f9dd85
Remove code for old order
yvonnefroehlich Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions Fig7_PyGMT_datetime.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "38df9b7b-1835-4ec9-aa00-a85c8b80730e",
"metadata": {},
"outputs": [],
"source": [
"# Copy finale version of script from normal Python file"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Binary file added Fig7_PyGMT_datetime.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions Fig7_PyGMT_datetime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import datetime

import pandas as pd
import pygmt
from pygmt.params import Box


fig = pygmt.Figure()

fig.basemap(
projection="X12c/6c",
region=[datetime.date(2016, 1, 1), datetime.date(2026, 12, 31), -50, 1000],
frame=["x+lYear", "ya100f50+lGitHub stars"],
)

for wrapper, file, color in zip(
["GMT", "GMT/MEX", "GMT.jl", "PyGMT"],
["gmt", "gmtmex", "gmtjl", "pygmt"],
["238/86/52", "253/131/68", "170/121/193", "63/124/173"],
strict=False,
):
df = pd.read_csv(f"star_history_{file}.csv")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also made a comment regarding the data source in the manuscript: Afaik it's not possible to directly load the data via URL? Would make the workflow much more professional than loading (outdated) individual csv's.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's not possible to directly load the data via URL?

I think the answer is no; however, Fig. 4 already demonstrates how to load a dataset via a URL, so reading CSV files in this example is not that bad.

In fact, I'm not happy with the star-history data, as the stars are unevenly sampled.

GitHub provides an API to retrieve star history. The Python script below returns the timestamp when each user starred the PyGMT project. The code is about 30 lines long, so it may be too long to include in the manuscript. Nevertheless, we could use the script to obtain the full history of project stars and then resample the data at every three-month intervals.

import requests
import pandas as pd

owner, repo = "GenericMappingTools", "pygmt"
headers = {"Accept": "application/vnd.github.v3.star+json"}

timestamps = []
page = 1

while True:
    r = requests.get(
        f"https://api.github.com/repos/{owner}/{repo}/stargazers",
        headers=headers,
        params={"per_page": 100, "page": page},
    )
    data = r.json()
    if not data:
        break

    timestamps += [s["starred_at"] for s in data]  # full ISO 8601 timestamp
    page += 1

timestamps.sort()  # ISO strings sort chronologically

df = pd.DataFrame({"timestamp": timestamps})
df["cumulative_stars"] = range(1, len(df) + 1)

print(df)

Copy link
Member Author

@yvonnefroehlich yvonnefroehlich Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be nice, but for me it still looks like, it is only possilbe to get a link which creates an live-updated time chart for the project GitHub README. And the CSV files one can download contain the date of downloading in the file name. Also the temporal sampling is a bit interesting, as it is not equally spaced and different for different repos; would prefer to have the data points for all repos at the same dates.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nevertheless, we could use the script to obtain the full history of project stars and then resample the data at every three-month intervals.

I guess @seisman means to group the data into 3-months buckets and just show for each project quarterly numbers. This would allow to have the same time-spacing for all repos.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like @seisman and I wrote our comments nearly at the same time 🙃, and we are both pointing out that the star-history data does not have an equal time spacing. And I am actually having the impression that the data points that are reported in the CSV file change over time.

Tried the request script from Dongdong. I do not think we have to show this directly in the manuscript. We can include it as a separate cell in the JN, but for the example itself, it should be OK to load the saved CSV files and focus on the plotting.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm thinking about which columns to store in the CSV file and what to include in the manuscript:

  1. Date and Stars at three-month intervals. It can be plotted directly, so the example code can focus on PyGMT plotting.
  2. Date and Stars for each GitHub user. Stars go from 1 to the max. In the example code, we'd need to resample it to three-month intervals before plotting.
  3. UserName and Date for each GitHub user. This is basically the raw data. We need to do data processing to get the cumulative stars before plotting. This also makes the code follow a clearer read → process → visualize workflow.

df["Date"] = df["Date"].str.split(" \\(").str[0]
df["Date"] = pd.to_datetime(
df["Date"], format="%a %b %d %Y %H:%M:%S GMT%z", utc=True
)

fig.plot(x=df["Date"], y=df["Stars"], pen=color)
fig.plot(x=df["Date"], y=df["Stars"], fill=color, style="a0.35c", label=wrapper)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps we should use four different symbols, although the star symbol is appropriate for a plot showing GitHub star history.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, I think I like to keep the stars. What does the others think?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The benefits of using different symbols are twofold: first, they demonstrate that PyGMT supports a wide variety of marker styles, and that auto-legend works well with them. Second, symbols with distinct markers are more effective for gray-scale printing and are more accessible for colorblind readers. For me, it's a little difficult to distinguish Julia's purple from Python's blue.

BTW, where did you get the colors?

With the Python yellow "255/212/59", the figure looks good to me, even with the same symbols:

Image

Copy link
Member

@michaelgrund michaelgrund Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @seisman. Especially for gray-scale printing (some people still do that 😆) and colorblind readers different symbols make it much easier to distinguish between the different entries.

  • I suggest to avoid yellow color on a white background.
  • Would change the legend entry order so that it follows the order of the last shown data point of each entry. Makes it much easier to read the figure.:
    • GMT
    • PyGMT
    • GMT.jl
    • GMT/MEX

Copy link
Member Author

@yvonnefroehlich yvonnefroehlich Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

distinct markers are more effective for gray-scale printing and are more accessible for colorblind readers.

This is a fair argument. Changed it in commit c144d8c.

gray-scale printing (some people still do that 😆)

Yep, students xD (and then color it by hand).

BTW, where did you get the colors?

Good question. I think these are the RGB codes I used for the example for the AGU presentation one year ago. But though this are the offical RGB codes, but unfortuantely I do not remember what went wrong here 🙁. Thanks for spotting! For the MATLAB logo, I extracted the RGB code from the logo, as I did not directly finde a source for the offical RGB code. Edit: Also fixed in the codes for the AGU presentation.

I suggest to avoid yellow color on a white background.

Agree, yellow on white background is not optimal and it depends on the screen how good the contrast / visibility is. Thus would keep the Python's blue

Would change the legend entry order so that it follows the order of the last shown data point of each entry. Makes it much easier to read the figure.

Hm. The order is currently based on the start of the project; maybe this is helpful for descripting the figure in the text.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, I got this. If people prefer this order I am OK with reordering this (see commit 0018c93). Probably, only a few people will recognize the order based on the start of the projects.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another option would be to get rid of the whole legend and add the repo labels at the end of each corresponding line. Just depends on if we want to show legend creation or not...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example shows the auto-legend feature, so I feel we should keep it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would keep the auto-legend feature. I think it's important to show that PyGMT can do this. For simple automazied plots updating the legend manually can get a bit inconvient. GMT-specific legend files or passing this synthax via an io.StringIO object would need some more explanation.

Copy link
Member Author

@yvonnefroehlich yvonnefroehlich Dec 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW, where did you get the colors?

Good question. I think these are the RGB codes I used for the example for the AGU presentation one year ago. But though this are the offical RGB codes, but unfortuantely I do not remember what went wrong here 🙁. Thanks for spotting! For the MATLAB logo, I extracted the RGB code from the logo, as I did not directly finde a source for the offical RGB code. Edit: Also fixed in the codes for the AGU presentation.

Regarding the MATLAB color: I still did not find an offical RGB code for the orange in the MATLAB logo. On this website (https://de.mathworks.com/help/matlab/visualize/creating-the-matlab-logo.html) MATLAB shows how users can create the logo on their own. There they use the color s.FaceColor = [0.9 0.2 0.2], but the afterwards applied lighting effects change the apperance of the color.

image


fig.legend(
position="jTL+o0.1c+w2.3", box=Box(fill="gray95", pen="0.5p,gray50", radius="3p"),
)

fig.show()
fig.savefig(fname="Fig7_PyGMT_datetime.png")
19 changes: 19 additions & 0 deletions star_history_gmt.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Repository,Date,Stars
GenericMappingTools/gmt,Sun Aug 12 2018 04:28:37 GMT+0200 (Mitteleuropäische Sommerzeit),0
GenericMappingTools/gmt,Mon Aug 13 2018 04:28:37 GMT+0200 (Mitteleuropäische Sommerzeit),1
GenericMappingTools/gmt,Fri Jan 04 2019 21:15:59 GMT+0100 (Mitteleuropäische Normalzeit),62
GenericMappingTools/gmt,Fri Mar 08 2019 15:57:05 GMT+0100 (Mitteleuropäische Normalzeit),123
GenericMappingTools/gmt,Thu Aug 01 2019 13:21:13 GMT+0200 (Mitteleuropäische Sommerzeit),184
GenericMappingTools/gmt,Tue Dec 10 2019 00:27:29 GMT+0100 (Mitteleuropäische Normalzeit),245
GenericMappingTools/gmt,Thu Mar 26 2020 09:37:59 GMT+0100 (Mitteleuropäische Normalzeit),306
GenericMappingTools/gmt,Sun Jul 19 2020 23:32:09 GMT+0200 (Mitteleuropäische Sommerzeit),367
GenericMappingTools/gmt,Thu Jan 21 2021 10:07:51 GMT+0100 (Mitteleuropäische Normalzeit),428
GenericMappingTools/gmt,Tue Jun 22 2021 19:14:01 GMT+0200 (Mitteleuropäische Sommerzeit),489
GenericMappingTools/gmt,Wed Dec 22 2021 03:00:24 GMT+0100 (Mitteleuropäische Normalzeit),550
GenericMappingTools/gmt,Fri Jun 24 2022 13:11:39 GMT+0200 (Mitteleuropäische Sommerzeit),611
GenericMappingTools/gmt,Wed Mar 01 2023 19:23:26 GMT+0100 (Mitteleuropäische Normalzeit),672
GenericMappingTools/gmt,Fri Sep 15 2023 09:52:04 GMT+0200 (Mitteleuropäische Sommerzeit),733
GenericMappingTools/gmt,Mon Apr 15 2024 08:20:29 GMT+0200 (Mitteleuropäische Sommerzeit),794
GenericMappingTools/gmt,Thu Dec 05 2024 07:00:13 GMT+0100 (Mitteleuropäische Normalzeit),855
GenericMappingTools/gmt,Fri Oct 17 2025 13:42:18 GMT+0200 (Mitteleuropäische Sommerzeit),916
GenericMappingTools/gmt,Fri Nov 21 2025 15:14:12 GMT+0100 (Mitteleuropäische Normalzeit),921
19 changes: 19 additions & 0 deletions star_history_gmtjl.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Repository,Date,Stars
GenericMappingTools/GMT.jl,Wed Feb 24 2016 04:55:51 GMT+0100 (Mitteleuropäische Normalzeit),0
GenericMappingTools/GMT.jl,Thu Feb 25 2016 04:55:51 GMT+0100 (Mitteleuropäische Normalzeit),1
GenericMappingTools/GMT.jl,Mon May 14 2018 22:45:09 GMT+0200 (Mitteleuropäische Sommerzeit),15
GenericMappingTools/GMT.jl,Tue Dec 25 2018 09:59:20 GMT+0100 (Mitteleuropäische Normalzeit),29
GenericMappingTools/GMT.jl,Thu Sep 05 2019 22:51:52 GMT+0200 (Mitteleuropäische Sommerzeit),43
GenericMappingTools/GMT.jl,Thu Feb 06 2020 08:02:08 GMT+0100 (Mitteleuropäische Normalzeit),57
GenericMappingTools/GMT.jl,Sat Jul 25 2020 01:53:54 GMT+0200 (Mitteleuropäische Sommerzeit),71
GenericMappingTools/GMT.jl,Sun Feb 07 2021 20:42:01 GMT+0100 (Mitteleuropäische Normalzeit),85
GenericMappingTools/GMT.jl,Wed Jul 21 2021 04:32:12 GMT+0200 (Mitteleuropäische Sommerzeit),99
GenericMappingTools/GMT.jl,Thu Nov 11 2021 04:12:13 GMT+0100 (Mitteleuropäische Normalzeit),113
GenericMappingTools/GMT.jl,Tue Feb 01 2022 10:40:01 GMT+0100 (Mitteleuropäische Normalzeit),127
GenericMappingTools/GMT.jl,Thu Sep 29 2022 21:50:54 GMT+0200 (Mitteleuropäische Sommerzeit),141
GenericMappingTools/GMT.jl,Thu Jun 08 2023 10:43:42 GMT+0200 (Mitteleuropäische Sommerzeit),155
GenericMappingTools/GMT.jl,Mon Nov 13 2023 05:20:11 GMT+0100 (Mitteleuropäische Normalzeit),169
GenericMappingTools/GMT.jl,Sat Mar 23 2024 08:08:10 GMT+0100 (Mitteleuropäische Normalzeit),183
GenericMappingTools/GMT.jl,Thu Jan 09 2025 15:59:08 GMT+0100 (Mitteleuropäische Normalzeit),197
GenericMappingTools/GMT.jl,Tue Oct 21 2025 11:38:42 GMT+0200 (Mitteleuropäische Sommerzeit),211
GenericMappingTools/GMT.jl,Fri Nov 21 2025 15:15:06 GMT+0100 (Mitteleuropäische Normalzeit),212
20 changes: 20 additions & 0 deletions star_history_gmtmex.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Repository,Date,Stars
GenericMappingTools/gmtmex,Sat Jul 01 2017 03:18:20 GMT+0200 (Mitteleuropäische Sommerzeit),0
GenericMappingTools/gmtmex,Sun Jul 02 2017 03:18:20 GMT+0200 (Mitteleuropäische Sommerzeit),1
GenericMappingTools/gmtmex,Mon May 14 2018 22:46:28 GMT+0200 (Mitteleuropäische Sommerzeit),4
GenericMappingTools/gmtmex,Wed Nov 14 2018 17:04:41 GMT+0100 (Mitteleuropäische Normalzeit),7
GenericMappingTools/gmtmex,Sat Jul 20 2019 16:00:45 GMT+0200 (Mitteleuropäische Sommerzeit),10
GenericMappingTools/gmtmex,Sat Jan 11 2020 06:41:28 GMT+0100 (Mitteleuropäische Normalzeit),13
GenericMappingTools/gmtmex,Fri Jun 12 2020 21:09:26 GMT+0200 (Mitteleuropäische Sommerzeit),16
GenericMappingTools/gmtmex,Sun Dec 13 2020 09:19:15 GMT+0100 (Mitteleuropäische Normalzeit),19
GenericMappingTools/gmtmex,Wed Jan 27 2021 09:39:12 GMT+0100 (Mitteleuropäische Normalzeit),22
GenericMappingTools/gmtmex,Mon Jun 28 2021 08:39:36 GMT+0200 (Mitteleuropäische Sommerzeit),25
GenericMappingTools/gmtmex,Thu Apr 28 2022 16:01:03 GMT+0200 (Mitteleuropäische Sommerzeit),28
GenericMappingTools/gmtmex,Sat Jun 18 2022 15:54:33 GMT+0200 (Mitteleuropäische Sommerzeit),31
GenericMappingTools/gmtmex,Tue Nov 29 2022 21:38:50 GMT+0100 (Mitteleuropäische Normalzeit),34
GenericMappingTools/gmtmex,Fri Jun 23 2023 14:39:56 GMT+0200 (Mitteleuropäische Sommerzeit),37
GenericMappingTools/gmtmex,Sun Apr 14 2024 00:06:35 GMT+0200 (Mitteleuropäische Sommerzeit),40
GenericMappingTools/gmtmex,Thu Nov 07 2024 09:32:06 GMT+0100 (Mitteleuropäische Normalzeit),43
GenericMappingTools/gmtmex,Tue Feb 11 2025 01:43:13 GMT+0100 (Mitteleuropäische Normalzeit),46
GenericMappingTools/gmtmex,Thu Jul 17 2025 14:13:40 GMT+0200 (Mitteleuropäische Sommerzeit),49
GenericMappingTools/gmtmex,Fri Nov 21 2025 15:23:28 GMT+0100 (Mitteleuropäische Normalzeit),51
18 changes: 18 additions & 0 deletions star_history_pygmt.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Repository,Date,Stars
GenericMappingTools/pygmt,Wed Mar 29 2017 18:55:38 GMT+0200 (Mitteleuropäische Sommerzeit),0
GenericMappingTools/pygmt,Thu Mar 30 2017 18:55:38 GMT+0200 (Mitteleuropäische Sommerzeit),1
GenericMappingTools/pygmt,Fri Dec 15 2017 05:43:03 GMT+0100 (Mitteleuropäische Normalzeit),56
GenericMappingTools/pygmt,Thu Aug 16 2018 00:40:24 GMT+0200 (Mitteleuropäische Sommerzeit),111
GenericMappingTools/pygmt,Thu Apr 04 2019 06:16:00 GMT+0200 (Mitteleuropäische Sommerzeit),166
GenericMappingTools/pygmt,Sun Feb 09 2020 03:16:37 GMT+0100 (Mitteleuropäische Normalzeit),221
GenericMappingTools/pygmt,Tue Sep 22 2020 16:42:43 GMT+0200 (Mitteleuropäische Sommerzeit),276
GenericMappingTools/pygmt,Tue Apr 06 2021 06:11:27 GMT+0200 (Mitteleuropäische Sommerzeit),331
GenericMappingTools/pygmt,Mon Sep 27 2021 08:17:59 GMT+0200 (Mitteleuropäische Sommerzeit),386
GenericMappingTools/pygmt,Tue Feb 08 2022 17:27:56 GMT+0100 (Mitteleuropäische Normalzeit),441
GenericMappingTools/pygmt,Sun Jun 19 2022 04:58:52 GMT+0200 (Mitteleuropäische Sommerzeit),496
GenericMappingTools/pygmt,Thu Dec 01 2022 19:47:20 GMT+0100 (Mitteleuropäische Normalzeit),551
GenericMappingTools/pygmt,Sun Jun 11 2023 18:13:29 GMT+0200 (Mitteleuropäische Sommerzeit),606
GenericMappingTools/pygmt,Sun Nov 12 2023 06:54:04 GMT+0100 (Mitteleuropäische Normalzeit),661
GenericMappingTools/pygmt,Fri May 10 2024 20:05:01 GMT+0200 (Mitteleuropäische Sommerzeit),716
GenericMappingTools/pygmt,Mon Jan 06 2025 20:51:42 GMT+0100 (Mitteleuropäische Normalzeit),771
GenericMappingTools/pygmt,Fri Nov 21 2025 15:13:34 GMT+0100 (Mitteleuropäische Normalzeit),825