2017-01-19 2 views
2

Je trace un ScatterPlot montrant les données du dernier mois en utilisant OxyPlot. Mais les étiquettes de l'axe X se chevauchent. L'axe X est un axe de date et d'heure.Oxyplot: empêcher le chevauchement des étiquettes de l'axe X

enter image description here

est ici la fonction que j'utiliser pour obtenir X Axis.

DateTimeAxis GetXAxis() 
{ 
    var axis = new DateTimeAxis { 
     Position = AxisPosition.Bottom, 
     MinorIntervalType = DateTimeIntervalType.Days, 
     MinorTickSize = 0, 
     MajorTickSize = 0, 
     MajorGridlineStyle = LineStyle.None, 
     MinorGridlineStyle = LineStyle.None, 
     FontSize = 8, 
     TextColor = OxyColor.Parse (ColorHex.DarkGray), 
     Maximum = DateTimeAxis.ToDouble (DateTime.Now), 
     MajorStep = 1, 
    }; 
    if (type == Constants.QUESTION_ANSWER_TYPE_WEEK) { 
     axis.Minimum = DateTimeAxis.ToDouble (DateTime.Now.AddDays (-7)); 
     axis.StringFormat = "ddd"; 
    } else if (type == Constants.QUESTION_ANSWER_TYPE_MONTH) { 
     axis.Minimum = DateTimeAxis.ToDouble (DateTime.Now.AddDays (-30)); 
     axis.StringFormat = "MMM dd"; 
    } else { 
     axis.StringFormat = "MMM dd"; 
    } 
    return axis; 
} 

Comment puis-je les empêcher de se chevaucher? Ai-je besoin d'ignorer les étiquettes manuellement? ou y a-t-il un réglage en oxyplot qui le fait automatiquement? En outre, est-il possible d'ajuster automatiquement les étiquettes lors d'un zoom avant ou arrière?

Répondre

2

Voici comment je l'ai résolu. J'ai fait usage de la propriété 'MajorStep' de l'axe

var axis = new DateTimeAxis(); 
... 

DateTime maxDate = .... // Max of DateTime from my data 
DateTime minDate = .... // Min of Datetime from my data 
double totalDays = (MaxDate - MinDate).TotalDays; 
if (totalDays > 8) 
    axis.MajorStep = (MaxDate - MinDate).TotalDays/8; // I want to show only 8 labels on X-Axis 

Et pour ajuster les étiquettes en zoomant In et Out:

axis.AxisChanged += (sender, e) => { 
    if (e.ChangeType == AxisChangeTypes.Zoom) { 
     axis.MajorStep = (DateTimeAxis.ToDateTime (axis.ActualMaximum) - DateTimeAxis.ToDateTime (axis.ActualMinimum)).TotalDays/8; 
    } 
};