gpt4 book ai didi

python - Pandas Dataframe 多色线图

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:45 25 4
gpt4 key购买 nike

我有一个带有日期时间索引和代表风速和环境温度的两列的 Pandas Dataframe。这是半天的数据

                        temp        winds

2014-06-01 00:00:00 8.754545 0.263636
2014-06-01 01:00:00 8.025000 0.291667
2014-06-01 02:00:00 7.375000 0.391667
2014-06-01 03:00:00 6.850000 0.308333
2014-06-01 04:00:00 7.150000 0.258333
2014-06-01 05:00:00 7.708333 0.375000
2014-06-01 06:00:00 9.008333 0.391667
2014-06-01 07:00:00 10.858333 0.300000
2014-06-01 08:00:00 12.616667 0.341667
2014-06-01 09:00:00 15.008333 0.308333
2014-06-01 10:00:00 17.991667 0.491667
2014-06-01 11:00:00 21.108333 0.491667
2014-06-01 12:00:00 21.866667 0.395238

我想将此数据绘制为颜色随温度变化的一条线。例如,从浅红色到深红色,温度越高。

我找到了这个 example of multicolored与 matplotlib 一致,但我不知道如何将其与 pandas DataFrame 一起使用。有谁知道我能做什么?如果可以做到这一点,是否也可以作为附加功能根据风速改变线条的宽度?所以风越快,线越宽。

感谢您的帮助!

最佳答案

pandas 中内置的plot 方法可能无法做到这一点。您需要提取数据并使用 matplotlib 绘制它们。

from matplotlib.collections import LineCollection
import matplotlib.dates as mpd

x=mpd.date2num(df.index.to_pydatetime())
y=df.winds.values
c=df['temp'].values
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lc = LineCollection(segments, cmap=plt.get_cmap('copper'), norm=plt.Normalize(0, 10))
lc.set_array(c)
lc.set_linewidth(3)
ax=plt.gca()
ax.add_collection(lc)
plt.xlim(min(x), max(x))
ax.xaxis.set_major_locator(mpd.HourLocator())
ax.xaxis.set_major_formatter(mpd.DateFormatter('%Y-%m-%d:%H:%M:%S'))
_=plt.setp(ax.xaxis.get_majorticklabels(), rotation=70 )
plt.savefig('temp.png')

enter image description here

有两个问题值得一提,

  • 颜色渐变的范围由norm=plt.Normalize(0, 10)控制
  • pandasmatplotlib 绘制时间序列的方式不同,这需要将 df.index 转换为 float在密谋之前。通过修改 major_locators,我们会将 xaxis majorticklabels 恢复为日期时间格式。
  • 第二个问题可能会导致我们想要绘制多条线时出现问题(数据将绘制在两个单独的 x 范围内):

    #follow what is already plotted:
    df['another']=np.random.random(13)
    print ax.get_xticks()
    df.another.plot(ax=ax, secondary_y=True)
    print ax.get_xticks(minor=True)

    [ 735385. 735385.04166667 735385.08333333 735385.125
    735385.16666667 735385.20833333 735385.25 735385.29166667
    735385.33333333 735385.375 735385.41666667 735385.45833333
    735385.5 ]
    [389328 389330 389332 389334 389336 389338 389340]

    因此我们需要在没有 pandas.plot() 方法的情况下完成它:

    ax.twinx().plot(x, df.another)

    enter image description here

    关于python - Pandas Dataframe 多色线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24590142/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com