-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add LineCollection plot #7173
base: main
Are you sure you want to change the base?
Add LineCollection plot #7173
Conversation
Scatter vs. Lines: ds = xr.tutorial.scatter_example_dataset(seed=42)
hue_ = "y"
x_ = "y"
size_="y"
z_ = "z"
fig = plt.figure()
ax = fig.add_subplot(1, 2, 1, projection='3d')
ds.A.sel(w="one").plot.lines(x=x_, z=z_, hue=hue_, linewidth=size_, ax=ax)
ax = fig.add_subplot(1, 2, 2, projection='3d')
ds.A.sel(w="one").plot.scatter(x=x_, z=z_, hue=hue_, markersize=size_, ax=ax) |
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For my taste it uses a bit too much private matplotlib API, hopefully that doesn't make things complicated in the long run. Maybe you can ask over at matplotlib to make some of these things public API?
With so many special cases it is always difficult to figure out if everything was thought of. My checks did not reveal any critical problems, so I guess we leave it like this and wait for bug reports.
Thanks!
for more information, see https://pre-commit.ci
I agree, but it should work fine to reference In my dream world matplotlib would add a similar function. |
Here's an interesting plot we should be easily be able to do with Lines: Would probably require fixing #8831 to get that nice looking datetime colorbar. Haven't found the data yet, noting it for the future. |
Add an entry in whats-new and this is good to go! Thanks! |
This looks nice. I have two requests:
On second thought, there is indeed a lot of private API here. Are you sure this is a good idea? It feels like major technical debt. Perhaps this is best suited to an external MPL extension? |
Done, I think?
Sure I don't mind a different name, but PathCollection -> plt.scatter -> xr.plot.scatter
I think 3d plotting is the sort of thing that xarray should be good at, with |
I'm fine with leaving it like this because currently there is really no nice way of rewriting it in a more "public" way. @dcherian you can also discuss this in the bi-weekly if you feel like it. |
Got this working with xarray: # https://www.reddit.com/r/dataisbeautiful/comments/1d4ahr1/oc_north_atlantic_sea_surface_temperature_anomaly/#lightbox
# https://github.com/afinemax/climate_change_bot/blob/main/bot.py
import requests
import numpy as np
import matplotlib.pyplot as plt
import xarray as xr
def download_json(url):
try:
response = requests.get(url)
response.raise_for_status() # Raise an exception for unsuccessful responses (4xx, 5xx)
json_data = response.json()
return json_data
except requests.exceptions.RequestException as e:
print(f"Error downloading JSON: {e}")
return None
url = r"https://climatereanalyzer.org/clim/sst_daily/json/oisst2.1_natlan1_sst_day.json"
sst_daily_data = download_json(url)
data = []
years = []
for i in range(len(sst_daily_data) - 3):
years.append((sst_daily_data[i]["name"]))
data.append(sst_daily_data[i]["data"])
# convert data from list into nd arr
data = np.asarray(data, dtype=float) # first index is year, 2nd index is day
# ds = xr.Dataset(
# data_vars=dict(temperature=(("year", "day"), data)),
# coords=dict(
# year=np.array(dict_names, dtype="datetime64[D]"),
# day=np.arange(data.shape[-1], dtype="timedelta64[D]"),
# ),
# )
ds = xr.Dataset(
data_vars=dict(
temperature=(
("year", "day"),
data,
dict(
long_name="Daily North Atlantic (0-60N) Sea Surface Temperature (SST)",
units="degC",
),
)
),
coords=dict(
year=np.array(years, dtype=int),
day=np.arange(data.shape[-1], dtype=int),
),
)
plt.figure()
ds.plot.lines(x="day", y="temperature", hue="year") I couldn't get it working with datetimes though. |
Some want to merge this finally? |
This adds a line plotter based on
LineCollections
, called.lines
.I wanted to replace
darray.plot()
with using LineCollection instead. But unfortunately due to how many cases are supported (and tested in xarray)darray.plot()
will continue usingplt.plot
.xref:
#4820
#5622