2010-08-24 6 views
0

Je développe une classe de conteneur d'histogrammes et j'essaie de déterminer où les points de coupure devraient être pour les classes. J'aimerais que les points de coupure soient des chiffres agréables, de la même manière que les graphiques sont mis à l'échelle.C# Date/Échelle de l'axe numérique

Pour distiller ma demande en une question de base: Y a-t-il une méthode de base par laquelle les étiquettes d'axe de données peuvent être déterminées à partir d'une liste de nombres.

Par exemple:

Array{1,6,8,5,12,15,22} 

Il serait logique d'avoir 5 bacs.

Bin Start Count 
0    1 
5    3 
10    2 
15    0 
20    1 

La séquence de début de groupe est identique à la sélection d'étiquettes d'axe sur un graphique dans cette instance.

Pour les besoins de cette question, je ne me soucie pas vraiment des cases et de l'histogramme, je m'intéresse plutôt à la partie étiquette de l'axe de la question.

Je vais utiliser C# 4.0 pour mon application, donc une solution astucieuse utilisant linq sont les bienvenues. J'ai essayé des trucs comme ça dans le passé lointain en utilisant du matériel de mise à l'échelle de la base de données 10, mais je ne l'ai jamais eu à travailler avec suffisamment de détails pour cette application. Je ne veux pas faire de mise à l'échelle, je viens d'utiliser la base 10 pour arrondir aux nombres entiers les plus proches. Je voudrais que cela fonctionne pour de grands nombres et de très petits nombres et peut-être aussi des dates; bien que les dates puissent être converties en doubles et analysées de cette façon.

Toutes les ressources sur le sujet seraient grandement appréciées.

Répondre

0

Vous pouvez commencer par quelque chose de simple:

NUM_BINS is a passed argument or constatn (e.g. NUM_BINS = 10) 
x is your array of x-values (e.g. int[] x = new int[50]) 

int numBins = x.Length < NUM_BINS ? x.Length : NUM_BINS; 

À ce stade, vous pouvez calco un histogramme de xes, et si les xes sont fortement sur un côté de la distribution (peut-être compter juste à gauche du point médian par rapport à right of midpoint), puis utilisez les divisions log/exp sur une plage de x []. Si l'histogramme est plat, utilisez des divisions linéaires.

double[] xAxis = new double[numBins]; 
double range = x[x.Length-1] - x[0]; 
CalcAxisValues(xAxis, range, TYPE); //Type is enum of LOG, EXP, or LINEAR 

Cette fonction permet également d'espacer les points en fonction du TYPE.