Python初学者/这里是第一张海报。你知道吗
我在散点图中添加色条时遇到了麻烦。我有两种类型的绘图:一种显示按日期颜色编码的所有数据,另一种只显示按日期颜色编码的数据的最大值。在第一种情况下,我可以使用测向指数(即datetime)生成颜色条,但在第二种情况下,我使用df2['col'].idxmax生成颜色,因为我的df2是数据框groupby对象,我正在使用它生成数据中的每日最大值,但它没有可访问的索引。你知道吗
对于第一种类型的绘图,我成功地生成了一个基于日期的颜色条,代码如下,这些颜色条是由在线示例拼凑而成的:
fig, ax = plt.subplots(1,1, figsize=(20,20))
smap=plt.scatter(df.col1, df.col2, s=140,
c=[date2num(i.date()) for i in df.index],
marker='.')
cb = fig.colorbar(smap, orientation='vertical',
format=DateFormatter('%d %b %y'))
但是对于第二种类型的绘图,我尝试使用df2['col'].idxmax来创建日期序列,而不是测向指数,以下不起作用:
for n in cols1:
for m in cols2:
fig, ax = plt.subplots(1,1, figsize=(15,15))
maxTimes=df2[n].idxmax()
PlottableTimes=maxTimes.dropna() #some NaNs in the
#.idxmax series were giving date2num trouble
smap2=plt.scatter(df2[n].max(), df2[m].max(),
s=160, c=[date2num(i.date()) for i in PlottableTimes],
marker='.')
cb2 = fig.colorbar(smap2, orientation='vertical',
format=DateFormatter('%d %b %y'))
plt.show()
错误为:“rgba序列的长度应为3或4”
因为错误是由于color参数引起的,所以我分别检查了各个plotting命令中color(即c=)参数的输出,它们看起来都与我相似,所以我无法理解为什么一个color参数有效,而另一个则无效:
有效的方法:
[公元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, …]
有什么建议或解释吗?我正在运行python3.5.2。事先谢谢你帮我理解这一点。你知道吗
编辑1:我做了下面的例子供别人探究,在这个过程中意识到问题的症结与我的第一个问题不同。下面的代码按照我希望的方式工作:
df=pd.DataFrame(np.random.randint(low=0, high=10, size=(169, 8)),
columns=['a', 'b', 'c', 'd', 'e','f','g','h']) #make sample data
date_rng = pd.date_range(start='1/1/2018', end='1/8/2018', freq='H')
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
df2=df.groupby(Grouper(key='ts', freq='D'))
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))
maxTimes=df2[n].idxmax()
PlottableTimes=maxTimes.dropna()
smap=plt.scatter(df2[n].max(), df2[m].max(), s=160,
c=[date2num(i.date()) for i in PlottableTimes],
marker='.')
cb = fig.colorbar(smap, orientation='vertical',
format=DateFormatter('%d %b %y'))
plt.show()
我的真实数据和这个示例之间的唯一区别是,我的真实数据有许多散乱的nan。所以,我认为错误的是'c='参数不够长,plotting命令无法将其解释为覆盖整个日期范围。。。?例如,如果我手动输入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))
maxTimes=df2[n].idxmax()
PlottableTimes=maxTimes.dropna()
smap=plt.scatter(df2[n].max(), df2[m].max(), s=160,
c=[736809.0, 736810.0, 736811.0, 736812.0, 736813.0, 736814.0, 736815.0, 736816.0],
marker='.')
cb = fig.colorbar(smap, orientation='vertical',
format=DateFormatter('%d %b %y'))
plt.show()
但是,如果我将c=array缩短了一部分,以模拟从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))
maxTimes=df2[n].idxmax()
PlottableTimes=maxTimes.dropna()
smap=plt.scatter(df2[n].max(), df2[m].max(), s=160,
c=[736809.0, 736810.0, 736811.0, 736812.0, 736813.0, 736814.0],
marker='.')
cb = fig.colorbar(smap, orientation='vertical',
format=DateFormatter('%d %b %y'))
plt.show()
所以这意味着真正的问题是:当没有一个列可以用df2.col抓取时,如何从groupby对象中抓取分组后的grouper列?我希望能够从下面抓取“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
本质上,您的Grouper调用类似于对日期时间列进行索引,并调用^{} 指定聚合函数:
因此,
df2['a'].max()
的返回是一个Pandas重采样器对象,非常类似于Pandas系列,因此带有可用于颜色条规范的index属性:从那里你可以进入
date2num
而无需理解列表:总之,只需在循环中使用上述内容,而无需maxTimes或PlottableTimes:
相关问题 更多 >
编程相关推荐