ChartDataLabelLocationMode
محتويات
[
يخفي
]ChartDataLabelLocationMode enumeration
يحدد كيفية تحديد القيم التي تحدد موقع تسمية البيانات -Left
و Top
الخصائص - يتم تفسيرها.
public enum ChartDataLabelLocationMode
قيم
اسم | قيمة | وصف |
---|---|---|
Offset | 0 | يتم تحديد موقع تسمية البيانات من خلال الإزاحة من الموضع المحدد بواسطة its Position الملكية. |
Absolute | 1 | يتم تحديد موقع تسمية البيانات باستخدام إحداثيات مطلقة، بدءًا من الزاوية اليسرى العليا من الرسم البياني. |
أمثلة
يوضح كيفية وضع تسميات البيانات الخاصة بالمخطط الدائري خارج المخطط الدائري.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
const int chartWidth = 432;
const int chartHeight = 252;
Shape shape = builder.InsertChart(ChartType.Doughnut, chartWidth, chartHeight);
Chart chart = shape.Chart;
ChartSeriesCollection seriesColl = chart.Series;
//حذف السلسلة المولدة افتراضيًا.
seriesColl.Clear();
//إخفاء الأسطورة.
chart.Legend.Position = LegendPosition.None;
// توليد البيانات.
const int dataLength = 20;
double totalValue = 0;
string[] categories = new string[dataLength];
double[] values = new double[dataLength];
for (int i = 0; i < dataLength; i++)
{
categories[i] = $"Category {i}";
values[i] = dataLength - i;
totalValue = totalValue + values[i];
}
ChartSeries series = seriesColl.Add("Series 1", categories, values);
series.HasDataLabels = true;
ChartDataLabelCollection dataLabels = series.DataLabels;
dataLabels.ShowValue = true;
dataLabels.ShowLeaderLines = true;
// لا يمكن استخدام خاصية الموضع في المخططات الدائرية. لنضع تسميات البيانات باستخدام اليسار والأعلى.
// الخصائص حول الدائرة خارج مخطط الدونات.
// الأصل موجود في الزاوية اليسرى العليا من الرسم البياني.
const double titleAreaHeight = 25.5; //يمكن حساب ذلك باستخدام نص العنوان والخط.
const double doughnutCenterY = titleAreaHeight + (chartHeight - titleAreaHeight) / 2;
const double doughnutCenterX = chartWidth / 2d;
const double labelHeight = 16.5; //يمكن حساب ذلك باستخدام خط التسمية.
const double oneCharLabelWidth = 12.75; //يمكن حساب ذلك لكل تسمية باستخدام النص والخط الخاص بها.
const double twoCharLabelWidth = 17.25; //يمكن حساب ذلك لكل تسمية باستخدام النص والخط الخاص بها.
const double yMargin = 0.75;
const double labelMargin = 1.5;
const double labelCircleRadius = chartHeight - doughnutCenterY - yMargin - labelHeight / 2;
// نظرًا لأن نقاط البيانات تبدأ من الأعلى، فإن إحداثيات X المستخدمة في خصائص اليسار والأعلى لـ
// تشير تسميات البيانات إلى اليمين وتشير إحداثيات Y إلى الأسفل، وزاوية البداية هي -PI/2.
double totalAngle = -System.Math.PI / 2;
ChartDataLabel previousLabel = null;
for (int i = 0; i < series.YValues.Count; i++)
{
ChartDataLabel dataLabel = dataLabels[i];
double value = series.YValues[i].DoubleValue;
double labelWidth;
if (value < 10)
labelWidth = oneCharLabelWidth;
else
labelWidth = twoCharLabelWidth;
double labelSegmentAngle = value / totalValue * 2 * System.Math.PI;
double labelAngle = labelSegmentAngle / 2 + totalAngle;
double labelCenterX = labelCircleRadius * System.Math.Cos(labelAngle) + doughnutCenterX;
double labelCenterY = labelCircleRadius * System.Math.Sin(labelAngle) + doughnutCenterY;
double labelLeft = labelCenterX - labelWidth / 2;
double labelTop = labelCenterY - labelHeight / 2;
// إذا كانت تسمية البيانات الحالية تتداخل مع تسميات أخرى، فقم بنقلها أفقيًا.
if ((previousLabel != null) &&
(System.Math.Abs(previousLabel.Top - labelTop) < labelHeight) &&
(System.Math.Abs(previousLabel.Left - labelLeft) < labelWidth))
{
// التحرك إلى اليمين في الأعلى، واليسار في الأسفل.
bool isOnTop = (totalAngle < 0) || (totalAngle >= System.Math.PI);
int factor;
if (isOnTop)
factor = 1;
else
factor = -1;
labelLeft = previousLabel.Left + labelWidth * factor + labelMargin;
}
dataLabel.Left = labelLeft;
dataLabel.LeftMode = ChartDataLabelLocationMode.Absolute;
dataLabel.Top = labelTop;
dataLabel.TopMode = ChartDataLabelLocationMode.Absolute;
totalAngle = totalAngle + labelSegmentAngle;
previousLabel = dataLabel;
}
doc.Save(ArtifactsDir + "Charts.DoughnutChartLabelPosition.docx");
أنظر أيضا
- مساحة الاسم Aspose.Words.Drawing.Charts
- المجسم Aspose.Words