Python初学者/第一张海报。
我在添加彩条以散点图时遇到了麻烦。我有两种类型的绘图一种显示按日期颜色编码的所有数据另一种显示按日期颜色编码的数据的最大值。在第一种情况下我可以使用df.index(这是datetime)来制作我的颜色条但在第二种情况下我使用df2 [col]。idxmax来生成颜色因为我的df2是一个df .groupby对象我用它来生成我的数据中的每日最大值并且它没有可访问的索引。
对于第一种类型的绘图我已成功生成带有以下代码的基于日期的颜色条从在线示例拼凑而成
fig, ax plt.subplots(1,1, figsize(20,20))
smapplt.scatter(df.col1, df.col2, s140,
c[date2num(i.date()) for i in df.index],
marker.)
cb fig.colorbar(smap, orientationvertical,
formatDateFormatter(%d %b %y))
但是对于第二种类型的情节我试图使用df2 [col]。idxmax创建日期系列而不是df.index以下不起作用
for n in cols1:
for m in cols2:
fig, ax plt.subplots(1,1, figsize(15,15))
maxTimesdf2[n].idxmax()
PlottableTimesmaxTimes.dropna() #some NaNs in the
#.idxmax series were giving date2num trouble
smap2plt.scatter(df2[n].max(), df2[m].max(),
s160, c[date2num(i.date()) for i in PlottableTimes],
marker.)
cb2 fig.colorbar(smap2, orientationvertical,
formatDateFormatter(%d %b %y))
plt.show()
错误是rgba序列的长度应为3或4
因为错误是抱怨颜色参数我在相应的绘图命令中分别检查颜色(即c )参数的输出并且两者看起来都类似于我所以我无法弄清楚为什么一个颜色参数工作而另一个没有
一个有效的
[736809.0
736809.0
736809.0
736809.0
736809.0
736809.0
736809.0
736809.0
736809.0
736809.0
...]
一个不起作用
[736845.0
736846.0
736847.0
736848.0
736849.0
736850.0
736851.0
736852.0
736853.0
736854.0
...]
有什么建议或解释吗我正在运行python 3.5.2。提前感谢您帮助我理解这一点。
编辑1我做了以下示例供其他人探索并在此过程中意识到问题的关键不同于我的第一个问题。下面的代码按我希望的方式工作
dfpd.DataFrame(np.random.randint(low0, high10, size(169, 8)),
columns[a, b, c, d, e,f,g,h]) #make sample data
date_rng pd.date_range(start1/1/2018, end1/8/2018, freqH)
df[i]date_rng
df df.set_index(i) #get a datetime index
df[ts]date_rng #get a datetime column to group by
from pandas import Grouper
df2df.groupby(Grouper(keyts, freqD))
for n in [a,b,c,d]: #now make some plots
for m in [e,f,g,h]:
print(m)
print(n)
fig, ax plt.subplots(1,1, figsize(5,5))
maxTimesdf2[n].idxmax()
PlottableTimesmaxTimes.dropna()
smapplt.scatter(df2[n].max(), df2[m].max(), s160,
c[date2num(i.date()) for i in PlottableTimes],
marker.)
cb fig.colorbar(smap, orientationvertical,
formatDateFormatter(%d %b %y))
plt.show()
我的真实数据和这个例子之间的唯一区别是我的真实数据中散布着许多NaN。所以我认为出现问题的是c 参数不足以让绘图命令将其解释为覆盖整个日期范围......例如如果我手动输入c 命令的输出我得到以下代码也可以工作
for n in [a,b,c,d]:
for m in [e,f,g,h]:
print(m)
print(n)
fig, ax plt.subplots(1,1, figsize(5,5))
maxTimesdf2[n].idxmax()
PlottableTimesmaxTimes.dropna()
smapplt.scatter(df2[n].max(), df2[m].max(), s160,
c[736809.0, 736810.0, 736811.0, 736812.0, 736813.0, 736814.0, 736815.0, 736816.0],
marker.)
cb fig.colorbar(smap, orientationvertical,
formatDateFormatter(%d %b %y))
plt.show()
但是如果我将c 数组缩短了一些为了模拟当我从idxmax中删除NaN时我的代码中发生了什么它会给出我看到的相同错误
for n in [a,b,c,d]:
for m in [e,f,g,h]:
print(m)
print(n)
fig, ax plt.subplots(1,1, figsize(5,5))
maxTimesdf2[n].idxmax()
PlottableTimesmaxTimes.dropna()
smapplt.scatter(df2[n].max(), df2[m].max(), s160,
c[736809.0, 736810.0, 736811.0, 736812.0, 736813.0, 736814.0],
marker.)
cb fig.colorbar(smap, orientationvertical,
formatDateFormatter(%d %b %y))
plt.show()
所以这意味着真正的问题是在从groupby对象分组后如何在df2.col中没有任何列可以抓取时如何抓取分组器列我希望能够从以下内容中获取ts并将其用作颜色数据而不是使用idxmax
df2[a].max()
ts
2018-01-01 9
2018-01-02 9
2018-01-03 9
2018-01-04 9
2018-01-05 9
2018-01-06 9
2018-01-07 9
2018-01-08 8
Freq: D, Name: a, dtype: int64
欢迎来到stackoverflow。 您可能希望阅读最小的可重现示例并在问题中提供一个。 否则人们怎么会发现什么是错的
基本上您的Grouper调用类似于对日期时间列进行索引并调用pandas.DataFrame.resample指定聚合函数
df.set_index(ts).resample(D).max()
# a b c d e f g h
# ts
# 2018-01-01 9 9 8 9 9 9 9 9
# 2018-01-02 9 9 9 9 9 9 9 9
# 2018-01-03 9 9 9 9 9 9 9 9
# 2018-01-04 9 9 9 9 9 9 9 9
# 2018-01-05 9 9 9 9 9 9 9 9
# 2018-01-06 9 9 9 8 9 9 9 9
# 2018-01-07 9 9 9 9 9 9 9 9
# 2018-01-08 2 8 6 3 1 3 2 7
因此df2[a].max()的返回是一个Pandas Resampler对象与Pandas系列非常相似因此带有可用于颜色条规范的索引属性
df[a].max().index
# DatetimeIndex([2018-01-01, 2018-01-02, 2018-01-03, 2018-01-04,
# 2018-01-05, 2018-01-06, 2018-01-07, 2018-01-08],
# dtypedatetime64[ns], namets, freqD)
从那里你可以传递到date2num没有列表理解
date2num(df2[a].max().index)
# array([736695., 736696., 736697., 736698., 736699., 736700., 736701., 736702.])
总而言之只需在循环中使用上面而不需要maxTimes或PlottableTimes
fig, ax plt.subplots(1, 1, figsize (5,5))
smap plt.scatter(df2[n].max(), df2[m].max(), s 160,
c date2num(df2[n].max().index),
marker .)
cb fig.colorbar(smap, orientation vertical,
format DateFormatter(%d %b %y))
谢谢你的回答和解释 它是你说的方式有道理但不知何故当我插入date2num(df2 [a]。max()。index)我得到这个错误"AttributeErrornumpy.datetime64对象没有属性toordinal"。 它也发生在循环内部。 我在某处错过了一步吗
您是否收到过帐或实际数据的错误
随着发布的数据。 我正在运行Python 3.5.2。
尝试更新您的pandas和/或matplotlib版本stackoverflow.com/q/47404653/1422451
谢谢 我正在努力尝试你的解决方案但我正试图更新大熊猫。 可能需要一段时间才能获得一些亲自帮助让我了解一下我所说的命令行错误。
在Unix(Mac / Linux)上使用通常的pip install --upgrade。 在Windows上安装二进制轮版本然后pip install /path/to/pkg.whl。
我为延迟道歉。 我能够更新我的包这个解决方案现在可以使用!! 非常感谢