【问题标题】:Basemap Scatter not plotting correctly底图散点图未正确绘制
【发布时间】:2017-04-05 01:43:25
【问题描述】:

基本上,我有一个 csv 填充了纬度和经度数据,我将这些数据添加到数据框中的两个单独列中。然后使用它来创建一个绘制所有数据的地球仪。除了数据没有正确绘制而且我不知道为什么。

读取数据文件并将其添加到 csv。

data_col = ['IP', 'Reliability', 'Risk', 'Type', 'Country', 'Locale', 'Co-Ords', '?'] 
data = pd.read_csv('reputation.data', sep='#', names=data_col)

获取 Co-Ords 列并将其拆分为两个不同的列

data['Co-Ords'] = data['Co-Ords'].str.replace('ut: ','')
data['lat'] = data['Co-Ords'].apply( lambda x: x.split(',')[0] )
data['lon'] = data['Co-Ords'].apply( lambda x: x.split(',')[1] )

将数据实现到底图;

m1 = Basemap(projection='ortho', lon_0=4,lat_0=46, resolution='l')

fig=plt.figure(figsize=(12, 6))

m1.drawmapboundary(fill_color='black')
m1.fillcontinents(color='white',lake_color='black')
m1.drawcoastlines()
m1.drawcountries()

x=(data['lat']).as_matrix()
y=(data['lon']).as_matrix()

m1.scatter(x,y,cmap=cm.cool,marker="*", color='r', alpha=0.7, 
latlon=True, zorder=10)
plt.title("IP Addresses on the Globe")
plt.show()

它看起来像下面这样: Globe

感谢您的帮助。

编辑:我正在读取的数据

IP  Reliability Risk    Type    Country Locale  Co-Ords ?   lat lon
46.4.123.15 4   2   Malicious   DE  NaN 51.0,9.0    3   51  9
116.117.253.243 3   2   Scanning    CN  Baotou  40.6521987915,109.82219696  11  40.6521987915   109.82219696
123.59.59.89    4   2   Malicious   CN  Beijing 39.9289016724,116.388298035 3   39.9289016724   116.388298035
123.59.71.2 4   2   Malicious   CN  Beijing 39.9289016724,116.388298035 3   39.9289016724   116.388298035
123.59.149.74   4   2   Malicious   CN  Beijing 39.9289016724,116.388298035 3   39.9289016724   116.388298035

【问题讨论】:

  • 您能否分享一个 5-10 行数据的 sn-p,您可以在其中注释数据点预计会出现在哪个国家/地区?
  • 谢谢,您能否将该输出作为文本附加到问题中,以便于复制?你可以做print(data.head()),然后把它复制到这里。另外,您是否绘制了这个子集以确认这些点也在地图上放错了位置?
  • 刚刚添加到帖子中
  • 我取了一组经度和纬度并将其放在我的地球仪上,并使用谷歌地图确认它是否在正确的区域。因此我知道为什么数据没有出现在正确的位置。

标签: python python-2.7 csv coordinates matplotlib-basemap


【解决方案1】:

您需要通过x, y = m1(x, y)convert your longitude and latitude to map coordinates。在下面的代码中,我用这一行替换了那行和你的矩阵转换,我认为这更清楚:y,x = m1(data['lon'].values, data['lat'].values)

这段代码对我有用

m1 = Basemap(projection='ortho', lon_0=4,lat_0=46, resolution='l')
fig=plt.figure(figsize=(12, 6))

m1.drawmapboundary(fill_color='black')
m1.fillcontinents(color='white',lake_color='black')
m1.drawcoastlines()
m1.drawcountries()

x,y = m1(data['lon'].values, data['lat'].values)
m1.scatter(x,y, marker="*", color='r', alpha=0.7, zorder=10)

plt.title("IP Addresses on the Globe")
plt.show()

【讨论】:

  • 完美,已修复。我尝试了类似的方法,但我猜 .values() 部分更正了应该如何读取值?
  • @A.Timmins 是的,我还注意到它无法将数据框中的列直接作为系列传递,.values() 将其转换为 numpy 数组。
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多