微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

matplotlib 散点图与 matplotlib 图之间的颜色参数是否一致?

如何解决matplotlib 散点图与 matplotlib 图之间的颜色参数是否一致?

我希望使用 matplotlib 来绘制月度数据的年际变化(如下)。通过在 c=ds['time.year'] 中传递 plt.scatter(),我达到了预期的结果。但是,我希望能够通过类似的 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)

输出

enter image description here

我尝试了以下方法,但不起作用:

plt.plot(ds['time.month'],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()

lines with the same colors as a comparable scatter plot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。