matplotlib 散点图与 matplotlib 图之间的一致颜色参数?
Consistent color argument between matplotlib scatter to matplotlib plot?
我希望使用 matplotlib 绘制月度数据的年际变化(下图)。通过在 plt.scatter()
中传递 c=ds['time.year']
,我实现了预期的结果。但是,我希望能够将这些点与类似的 plt.plot()
调用联系起来。这可能吗?
import pandas as pd
import matplotlib.pyplot as plt
import xarray as xr
# create y data
y = []
for yr in range(10):
for mo in range(12):
y.append(yr+mo+(yr*mo)**2)
# create datetime vector
t = pd.date_range(start='1/1/2010', periods=120, freq='M')
# combine in DataArray
ds = xr.DataArray(y, coords={'time':t}, dims=['time'])
# scatter plot with color
im = plt.scatter(ds['time.month'], ds.values, c=ds['time.year'])
plt.colorbar(im)
输出:
我尝试了以下方法,但它不起作用:
plt.plot(ds['time.month'], ds.values, c=ds['time.year'])
您可以创建一个范数,将年份范围映射到颜色范围。规范与使用的颜色图一起,可以作为 ScalarMapple
的输入来创建伴随的颜色条。使用默认的 'viridis' 颜色图,代码可能如下所示:
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import pandas as pd
import xarray as xr
y = []
for yr in range(10):
for mo in range(12):
y.append(yr + mo + (yr * mo) ** 2)
t = pd.date_range(start='1/1/2010', periods=120, freq='M')
ds = xr.DataArray(y, coords={'time': t}, dims=['time'])
norm = plt.Normalize(ds['time.year'].min(), ds['time.year'].max())
cmap = plt.cm.get_cmap('viridis')
for year in range(int(ds['time.year'].min()), int(ds['time.year'].max()) + 1):
plt.plot(ds['time.month'][ds['time.year'] == year],
ds.values[ds['time.year'] == year],
ls='-', marker='o', color=cmap(norm(year)))
plt.colorbar(ScalarMappable(cmap=cmap, norm=norm))
plt.xticks(range(1, 13))
plt.show()
我希望使用 matplotlib 绘制月度数据的年际变化(下图)。通过在 plt.scatter()
中传递 c=ds['time.year']
,我实现了预期的结果。但是,我希望能够将这些点与类似的 plt.plot()
调用联系起来。这可能吗?
import pandas as pd
import matplotlib.pyplot as plt
import xarray as xr
# create y data
y = []
for yr in range(10):
for mo in range(12):
y.append(yr+mo+(yr*mo)**2)
# create datetime vector
t = pd.date_range(start='1/1/2010', periods=120, freq='M')
# combine in DataArray
ds = xr.DataArray(y, coords={'time':t}, dims=['time'])
# scatter plot with color
im = plt.scatter(ds['time.month'], ds.values, c=ds['time.year'])
plt.colorbar(im)
输出:
我尝试了以下方法,但它不起作用:
plt.plot(ds['time.month'], ds.values, c=ds['time.year'])
您可以创建一个范数,将年份范围映射到颜色范围。规范与使用的颜色图一起,可以作为 ScalarMapple
的输入来创建伴随的颜色条。使用默认的 'viridis' 颜色图,代码可能如下所示:
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import pandas as pd
import xarray as xr
y = []
for yr in range(10):
for mo in range(12):
y.append(yr + mo + (yr * mo) ** 2)
t = pd.date_range(start='1/1/2010', periods=120, freq='M')
ds = xr.DataArray(y, coords={'time': t}, dims=['time'])
norm = plt.Normalize(ds['time.year'].min(), ds['time.year'].max())
cmap = plt.cm.get_cmap('viridis')
for year in range(int(ds['time.year'].min()), int(ds['time.year'].max()) + 1):
plt.plot(ds['time.month'][ds['time.year'] == year],
ds.values[ds['time.year'] == year],
ls='-', marker='o', color=cmap(norm(year)))
plt.colorbar(ScalarMappable(cmap=cmap, norm=norm))
plt.xticks(range(1, 13))
plt.show()