2017-03-20 1 views
0

I ont un jeu de données 4-D (comme xr.DataArray) avec des dimensions temperature, datasource, time et altitude.données multidimensionnelles dans Holoviews

Comment puis-je créer un nuage de points avec temperature(src0, z) par rapport à temperature(src1, z), de sorte que je puisse sélectionner l'altitude via un curseur?

J'ai actuellement le problème que lorsque je convertir les données à un hv.Table, j'ai entre autres une colonne datasource et une colonne temperature, et je ne peux pas comprendre comment tracer temperature(datasource=='src0') contre temperature(datasource=='src1')


EDIT:

I essayer de clarifier: j'ai un jeu de données 4-D DATA (qui est un xr.DataArray) avec des dimensions data_variable, datasource, time et altitude.

data_variable a 2 entrées, temperature et humidity.

datasource a 2 entrées, model et measurement

Il y a 6 altitudes et 2000 fois ~.

Comment puis-je créer un diagramme de dispersion qui a

  • sur l'axe x les données du datasourcemodel
  • sur l'axe y des données pour le datasourcemeasurement

de sorte que altitude et data_variable peuvent être sélectionnés avec un curseur?

+0

Si vous voulez altitude comme un curseur, comment voulez-vous qu'il se comporter , étant donné que l'altitude est un nombre réel, la valeur du curseur peut correspondre ou non à une valeur de donnée particulière? Est-ce que les données sont quadrillées par rapport à l'altitude, ou voulez-vous classer par altitude dans un ensemble fini de valeurs d'altitude? –

+0

le curseur d'altitude doit sélectionner l'une des 6 valeurs de la cote d'altitude à la fois –

Répondre

1

Si je comprends bien votre question, vous voulez tracer des valeurs de dispersion de la température dans le temps en comparant les deux sources de données et indexées par différentes altitudes?

# Load the data into a holoviews Dataset 
ds = hv.Dataset(data_array) 

# Create Scatter objects plotting time vs. temperature 
# and group by altitude and datasource 
scatter = ds.to(hv.Scatter, 'time', 'temperature', 
       groupby=['altitude', 'datasource'], dynamic=True) 

# Now overlay the datasource dimension and display 
scatter.overlay('datasource') 

Espérons que je compris votre question, mais en fonction de ce modèle de base, vous devriez être en mesure de tracer les données quel que soit arrangement que vous voulez. Editer: En fonction de votre modification, le problème principal est que HoloViews s'attend à ce que chaque variable de données soit dans un tableau séparé, en termes de pandas, vous devez faire l'équivalent de pd.melt.

# Define data array like yours 
dataarray = xr.DataArray(np.random.rand(10, 10, 2, 2), name='variable', 
        coords=[('time', range(10)), ('altitude', range(10)), 
          ('datasource', ['model', 'measurement']), 
          ('data_variable', ['humidity', 'temperature'])]) 

# Groupby datasource and data_variable, combining the resultant array into a Dataset with 4 data variables 
group_dims = ['datasource', 'data_variable'] 
grouped = hv.Dataset(dataarray, datatype=['xarray']).groupby(group_dims) 
dataset = xr.merge([da.data.rename({'variable': ' '.join(key)}).drop(group_dims) 
        for key, da in grouped.items()]) 

ds = hv.Dataset(dataset) 
scatter = ds.to(hv.Scatter, 'model temperature', 'measurement temperature', 'altitude') 

Notez cependant que, tout en testant ce je suis tombé sur un bug, que je l'ai maintenant ouvert un PR pour (voir here)

+0

Non, ce n'est pas ce que je veux. Sur l'axe 'x' il devrait y avoir la température pour' datasource [0] ', et sur l'axe y la température pour' datasource [1] '. –

+0

s'il vous plaît voir ma question mise à jour où j'ai essayé de clarifier –

+0

Juste fait un montage avec une réponse mise à jour. – philippjfr