爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2020|回复: 2

在地图上绘制站点bar图

[复制链接]

新浪微博达人勋

发表于 2023-5-22 12:38:54 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
先读取所有站点的相关数据。在地图上绘制站点bar图有两种方法,一种方法是为每一个站点添加一个坐标系(Axes),坐标系的建立目前还不能直接利用地图坐标,所以需要用data2pixel函数将站点坐标转为图像坐标,然后再生成bar图所需的坐标系(需要使用units='pixels'参数),再用bar函数绘制直方图即可。需要注意的这种方式成图后图形大小交互式改变会导致坐标系位置偏差,需要重新运行脚本。

  1. #Read data
  2. fn = os.path.join(migl.get_sample_folder(), 'ASCII', 'wp.csv')
  3. df = DataFrame.read_table(fn, delimiter=',', format='%9f', index_col=0)
  4. lons = df['lon'].values
  5. lats = df['lat'].values
  6. models = df['model%'].values
  7. ois = df['oi%'].values
  8. enois = df['enoi%'].values
  9. n = len(lons)
  10. maxv = max([models.max(), ois.max(), enois.max()])

  11. #Creat a map axes
  12. #figure(figsize=[700,550], newfig=False)
  13. proj = projinfo(proj='lcc', lon_0=105, lat_1=25, lat_2=47)
  14. ax = axesm(outerposition=[0,0,1,1], projinfo=proj, gridline=False)
  15. geoshow('cn_province', edgecolor='gray')
  16. geoshow('china', edgecolor='b')
  17. scatter(lons, lats, color='k', edge=False, size=4)
  18. axism([78, 130, 14, 53])

  19. #Draw figure so we can use data2pixel function
  20. draw()
  21. h = 25
  22. w = 20
  23. cols = ['r','b','g']
  24. for lon,lat,model,oi,enoi in zip(lons,lats,models,ois,enois):
  25.     x, y = ax.data2pixel(lon, lat)
  26.     print lon, lat
  27.     data = [model, oi, enoi]
  28.     #Draw fixed pixels size pie charts at specific longitude/latitude
  29.     ax1 = axes(position=[x, y, w, h], units='pixels', axis=False)   
  30.     left = 0
  31.     width = .1
  32.     for i in range(3):
  33.         bar(left, data, width, color=cols, edgecolor='gray')
  34.         left += width  
  35.     ylim(0, maxv)  

  36. ax1 = axes(position=[150, 100, w * 3, h], units='pixels', axis=False)
  37. left = 0
  38. width = 1
  39. labels = ['model (%)','oi (%)','enoi (%)']
  40. bb = []
  41. data = [60, 80, 100]
  42. for i in range(3):
  43.     b = bar(left, data, width, color=cols, edgecolor='gray', label=labels)
  44.     bb.append(b)
  45.     left += width  
  46. text(left+0.5, 50, '100', xalign='left', yalign='center', fontsize=12)
  47. ylim(0, maxv)
  48. xlim(0, 9)
  49. ax2 = axes(position=[130, 30, 100, 100], units='pixels', axis=False)
  50. legend(ax1.get_legend(), loc='lower left', fontsize=12, frameon=False)

  51. #Add south China Sea
  52. axesm(position=[0.8,0.08,0.15,0.2], projinfo=proj, axison=False, gridlabel=False, frameon=True)
  53. geoshow('cn_border', facecolor=(0,0,255))
  54. axism([106, 123, 2, 23])


map_bar.png

另一种方式是先用scatter函数生成站点图层,并将数据加入站点图层的属性表中,然后用图层的add_charts函数添加所有站点的直方图。

  1. #Read data
  2. fn = 'D:/Temp/ascii/wp.csv'
  3. df = DataFrame.read_table(fn, delimiter=',', format='%9f', index_col=0, index_format='%s')
  4. ids = df.index.data
  5. lons = df['lon'].values
  6. lats = df['lat'].values
  7. models = df['model%'].values
  8. ois = df['oi%'].values
  9. enois = df['enoi%'].values
  10. n = len(lons)
  11. maxv = max([models.max(), ois.max(), enois.max()])

  12. #Creat a map axes
  13. figure(figsize=[1000,656], newfig=False)
  14. proj = projinfo(proj='lcc', lon_0=105, lat_1=25, lat_2=47)
  15. ax = axesm(outerposition=[0,0,1,1], projinfo=proj, gridline=False)
  16. geoshow('china', edgecolor='b')
  17. layer = scatter(lons, lats, color='k', edge=False, size=4)
  18. layer.addfield('ID', 'string', ids)
  19. layer.addfield('model', 'float', models)
  20. layer.addfield('oi', 'float', ois)
  21. layer.addfield('enoi', 'float', enois)
  22. cols = ['r', 'g', 'b']
  23. labels = ['model (%)','oi (%)','enoi (%)']
  24. ls = makesymbolspec('polygon', dict(color=cols[0], edgecolor='gray', caption=labels[0]), \
  25.     dict(color=cols[1], edgecolor='gray', caption=labels[1]),
  26.     dict(color=cols[2], edgecolor='gray', caption=labels[2]))
  27. layer.add_charts(['model','oi','enoi'], ls, avoidcoll=False, align='none')
  28. layer.addlabels('ID', avoidcoll=False, yoffset=-5)
  29. layer.movelabel('58606', x=10)
  30. axism([78, 130, 14, 53])

  31. # Add legend axes
  32. w = 24
  33. h = 50
  34. ax1 = axes(position=[150, 100, w * 3, h], units='pixels', axis=False)
  35. left = 0
  36. width = 1
  37. bb = []
  38. data = [60, 80, 100]
  39. for i in range(3):
  40.     b = bar(left, data, width, color=cols, edgecolor='gray', label=labels)
  41.     bb.append(b)
  42.     left += width  
  43. text(left+0.5, 50, '100', xalign='left', yalign='center', fontsize=12)
  44. ylim(0, maxv)
  45. xlim(0, 9)
  46. ax2 = axes(position=[130, 30, 100, 100], units='pixels', axis=False)
  47. legend(ax1.get_legend(), loc='lower left', markerscale=1.2, fontsize=12, frameon=False)

  48. #Add south China Sea
  49. axesm(position=[0.78,0.08,0.15,0.2], projinfo=proj, axison=False, gridlabel=False, frameon=True)
  50. geoshow('cn_border', facecolor=(0,0,255))
  51. axism([106, 123, 2, 23])


map_bar_layer.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-5-22 19:37:29 | 显示全部楼层
谢谢王老师
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-5-29 17:18:59 来自手机 | 显示全部楼层
谢谢分享,值得学习

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表