2016-11-11 1 views
1

각 점의 크기에 따라 결정되는 점의 zorder를 기준으로 산점도가있는 기준면을 만들려고합니다. 따라서 포인트가 완전히 덮히지 않습니다. (이상적인 최종 결과는 황소처럼 보일 것입니다.)크기에 따라 결정되는 zorder가있는 Basemap scatterplot

이의 나는 다음과 같은 코드가 있다고 가정 해 봅시다 :

Ca_data = array([0.088, 0.094, 0.097, 0.126, 0.112, 0.092, 0.076, 0.105]) 
SO4_data = array([0.109, 0.001, 0.001, 0.007, 0.214, 0.005, 0.008, 0.559]) 
longitude = linspace(-101, -100, 8) 
latitude = linspace(34.5, 35, 8) 

m=Basemap(llcrnrlon=-101,llcrnrlat=34.5,urcrnrlon=-100,urcrnrlat=35,resolution='c', epsg=4326) 
m.arcgisimage(server='http://server.arcgisonline.com/ArcGIS', service='ESRI_Imagery_World_2D', xpixels=1500, ypixels=1500, zorder=1) 
m.scatter(longitude, latitude, latlon=True, s=6000*Ca_data,c='r',marker="o",label='Ca') 
m.scatter(longitude, latitude, latlon=True, s=6000*SO4_data,c='b',marker="o",label='SO4') 
plt.show() 

을 그대로 어디서나 SO4이 칼슘보다 큰, 난 단지 SO4를 볼 것입니다. 들어가서 각 줄에 zorder를 추가하는 방법을 고려해 보았습니다.하지만 동일한 문제를 추가 할 요소가 몇 개 더 있으므로 잘 작동하지 않을 것이라고 생각합니다. 어떤 아이디어?

+0

내가 basemap을 설치하지 않았으므로 모호한 추측 만합니다. 크기에 따라 데이터를 정렬하려고 시도 했습니까? 자동으로 zorder로 변환 될 것으로 기대하십니까? 나는 산란의 내부에 익숙하지 않다. –

+0

나는 당신이 무엇을 제안하는지 잘 모르겠습니다. 값이 가장 작은 값에서 가장 큰 값으로 정렬되도록 데이터의 각 요소를 정렬하면 각 값이 여전히 같은 위치에 묶여 있으므로 작동하지 않습니다. 아니면 가장 큰 농도의 원소를 먼저 나열했기 때문에, 다른 원소보다 더 작은 원소 뒤에 여전히 나타납니다. 필자는 그것에 대해 생각했지만 예제 데이터 세트 에서처럼 더 크고 더 작은 일부 요소 쌍을 교환합니다. 그 중 하나, 또는 완전히 다른 것을 의미 했습니까? – nightzephyr

+0

나는 후자를 의미했다. 'np.argsort'를 사용하여 각각의 데이터 세트에 하나씩 두 개의 정렬 배열을 정의 할 수 있습니다. 그런 다음 경도 [ind1], 위도 [ind1], 6000 * Ca_data [ind1] 및 경도 [ind2], 위도 [ind2], 6000 * SO4_data [ind2]'에 대해 '분산 형'을 호출합니다. * 이것이 * zorder에 영향을 주면 문제없이 작동합니다. –

답변

0

이 작업을 수행하는 방법을 알 수있는 유일한 방법은 한 번에 두 데이터 집합을 그려 보는 것입니다. 그렇지 않으면 으로가는 길은 없습니다. 첫 번째 데이터 세트 위에 두 번째 데이터 세트를 그립니다.

대부분이 쉽게 수행 할 수 있습니다. 유일한 문제는 label kwarg가 scatter 인 것입니다. scatter에 대해 elementwise (array_like) 크기와 색상을 지정할 수 있지만 레이블로 표시 할 수는 없습니다. 데이터의 시각화가 훨씬 더 중요하다으로하지만, 나중에 (주로, 전설을) 라벨 관련 문제를 해킹,이 길을 갈 것 :

import numpy as np 
from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 

Ca_data = np.array([0.088, 0.094, 0.097, 0.126, 0.112, 0.092, 0.076, 0.105]) 
SO4_data = np.array([0.109, 0.001, 0.001, 0.007, 0.214, 0.005, 0.008, 0.559]) 
longitude = np.linspace(-101, -100, 8) 
latitude = np.linspace(34.5, 35, 8) 

# this is the new part: concatenate all the data  
plotlon = np.tile(longitude,2) 
plotlat = np.tile(latitude,2) 
plotdat = np.concatenate((6000*Ca_data,6000*SO4_data)) # sizes 
cdat = np.repeat(('r','b'),longitude.size)    # colors 

# determine reverse sorting order 
inds = np.argsort(plotdat)[::-1] 

plt.figure() 
m = Basemap(llcrnrlon=-101,llcrnrlat=34.5,urcrnrlon=-100,urcrnrlat=35,resolution='c', epsg=4326) 
m.arcgisimage(server='http://server.arcgisonline.com/ArcGIS', service='ESRI_Imagery_World_2D', xpixels=1500, ypixels=1500, zorder=1) 
# use a single scatter() call, with ordered-concatenated data 
m.scatter(plotlon[inds], plotlat[inds], latlon=True, s=plotdat[inds],c=cdat[inds],marker="o") # label has been removed! 

plt.show() 

result

일반화 n에 데이터 세트는 간단합니다. 위도와 경도가 각각 tile이고 너비가 n 일 때 2가 필요하며 각 데이터 세트에 대해 repeat의 색상이 필요합니다.

+0

@nightzephyr 도움이 되었기 때문에 기쁩니다 :) 답변이 정말로 당신의 질문을 해결했다면 [받아 들일 수있는 것으로 표시하십시오] (http://stackoverflow.com/help/accepted-answer)를 고려해보십시오. –