如何使石斑鱼和轴的长度相同?

Posted

技术标签:

【中文标题】如何使石斑鱼和轴的长度相同?【英文标题】:How to make grouper and axis the same length? 【发布时间】:2013-10-29 07:46:02 【问题描述】:

对于我的任务,我应该使用 matplotlib 在地图上绘制 20 场飓风的轨迹。但是,当我运行我的代码时,我得到了错误:AssertionError:Grouper and axis must be the same length

这是我的代码:

import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt 
from PIL import *
fig = plt.figure(figsize=(12,12))

ax = fig.add_axes([0.1,0.1,0.8,0.8])

m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57.,
        projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60.,
        resolution ='l',area_thresh=1000.)

m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)

# Creates parallels and meridians

m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
m.drawmapboundary(fill_color='aqua')

# Opens data file

import pandas as pd
name = [ ]
df = pd.read_csv('louisianastormb.csv')
for name, group in df.groupby([name]):
    latitude = group.lat.values
    longitude = group.lon.values
    x,y = m(longitude, latitude)
    plt.plot(x,y,'y-',linewidth=2 )
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    plt.title('20 Hurricanes with Landfall in Louisiana')

plt.savefig('20hurpaths.jpg', dpi=100)

这是完整的错误输出:

 Traceback (most recent call last): 
File "/home/darealmzd/lstorms.py", line 31, in <module> 
for name, group in df.groupby([name]): 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 186, in groupby 
squeeze=squeeze) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 533, in groupby 
return klass(obj, by, **kwds) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 197, in __init__ 
level=level, sort=sort) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1325, in _get_grouper 
ping = Grouping(group_axis, gpr, name=name, level=level, sort=sort) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1129, in __init__ 
self.grouper = _convert_grouper(index, grouper) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1350, in _convert_grouper 
raise Assertionerror('Grouper and axis must be same length') 
Assertionerror: Grouper and axis must be same length 

【问题讨论】:

您需要提供更多详细信息。错误发生在哪一行?这是第一次通过你的 for 循环吗?完整的错误输出是什么? @TomAugspurger 我刚刚添加了完整的错误输出。我无法使用 group by 对经度和纬度值进行分组以绘制风暴路径。 看起来name 是空的,您是要这样做吗?可能需要在那里有一个列名。 另外,你能把print df.head(5)的结果也加到上面吗? @JeffTratner 好的,谢谢。是否必须在 csv 文件中指定列名“lat”和/或“lon”?我要做的是将文件中的经度和纬度列放入两个单独的列表中,以便我可以将它们绘制在地图上。 【参考方案1】:

问题是您(有效地)按空列表([[]])的列表进行分组。因为您之前有name = [],然后您也将其包装在一个列表中。

如果您想在单个列上进行分组(称为“HurricaneName”),您应该执行以下操作:

for name, group in df.groupby('HurricaneName'):

但是,如果你想在多个列上进行分组,那么你需要传递一个列表:

for name, group in df.groupby(['HurricaneName', 'Year'])

如果你想像你一样把它放在一个变量中,你可以这样做:

col_name = 'State'

for name, group in df.groupby([col_name]):

【讨论】:

是否必须在 csv 文件中指定列名“lat”和/或“lon”?我要做的是将文件中的经度和纬度列放入两个单独的列表中,以便我可以将它们绘制在地图上。 @mikez1 不 - 这些只是虚拟名称,您只需要使用 csv 中的任何名称来进行分组。重新阅读您的问题 - 看起来您想对其他内容进行分组(也许您的意思是对飓风进行分组,以便您可以绘制随时间的变化?)如果是这样,那么您想对 'HurricaneName' 之类的内容进行分组。我将编辑我的答案以反映这一点。如果这回答了您的原始问题(关于错误消息),您可以检查我的答案下方的箭头以标记您的问题已解决。 我的文件设置方式是文件开头的年份、名称、纬度、经度,下面是数据。那么for name, group in df.groupby(['Name']): latitude = group.Latitude.values group.Longitude.values x,y(latitude,longitude) 是正确的吗? 是的,这似乎是正确的,它将生成按“名称”分组的结果(听起来) 好的。非常感谢你的帮助。但是现在我在尝试绘制 x,y 坐标时遇到错误。你能帮忙Traceback (most recent call last): File "/home/darealmzd/lstorms.py", line 42, in &lt;module&gt; x,y(latitude,longitude) NameError: name 'x' is not defined 【参考方案2】:

ValueError: Grouper and axis must be same length

如果您在 groupby 参数中使用双括号,则会发生这种情况。

(我发布了这个,因为它是 Google 上的最高结果)。

【讨论】:

这对我有帮助,因为我更新了数据透视表的索引参数,但未能删除方括号 data_pivot = pd.pivot_table(input_data, values=’id', #old_index=['level1','level2', 'level3'], index=columns, columns=['data_type'], fill_value = 0, aggfunc='count') 其中列是数据框中的列列表。【参考方案3】:

尝试 iloc 使 grouper 等于轴。

示例: sns.boxplot(x=df['pH-binned'].iloc[0:3], y=v_count, data=df)

如果轴=3。

【讨论】:

以上是关于如何使石斑鱼和轴的长度相同?的主要内容,如果未能解决你的问题,请参考以下文章

Python - groupby 多列 - ValueError:分组器和轴必须相同的长度

qt如何设置Tab键长度?求大神指教

MATLAB图中轴标签和轴之间的距离

html D3byEX 4.10:带边距和轴的条形图(适用于D3.js v4)

PyQt4 - 将滑块的范围链接到绘图轴的范围

如何将引导列中的项目居中,以使每个项目都从相对于 X 轴的相同位置开始?