-
-
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
…to plot1d_lines
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
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, but is unrelated to this pr. |
Some want to merge this finally? |
for more information, see https://pre-commit.ci
…to plot1d_lines
Felt the need for this one again. I'm going to self-merge next week unless someone has any further thoughts. |
Let's go |
I tried out this PR, as it implements something similar to (but not quite) what I was looking for. Is this interface meant only to support variable sizes and colors based on a coordinate/variable, like scatter? I noticed that float values for My (very frequent) use case here is just that of |
my only concern is the one character difference between |
It's intended to be similar to scatter, yes. I've found the same arguments for using size on scatterplots can be made for lineplots.
My idea for quick discrete colorbars is to simply convert the hue variable to string. |
line_collection implies a more basic version in my mind:
Seaborns new object-based plotting uses |
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
.Examples:
Got this working with xarray:
Calling it lines since scatter is not called path_collection:
Seaborns new object-based plotting uses
lines
as well with similar argument:https://seaborn.pydata.org/generated/seaborn.objects.Line.html
https://seaborn.pydata.org/generated/seaborn.objects.Lines.html
xref:
#4820
#5622