红着眼 2024-03-13 17:19 采纳率: 27.8%
浏览 16
已结题

C# 用Chart生成柱状图报表,文字对齐的问题。

我想让显示的文字“项目1的提示,休息时间,测试数据 等”与柱状图的底部对齐显示。请问是哪一个属性设置呢。
我用如下这些代码的属性设置都不管用。

item.CustomProperties = "LabelStyle=Bottom";
MainTJChart.Series[0].Points[1].LabelAlignment = StringAlignment.Far;
MainTJChart.Series[0].Points[1].LabelStyle = LabelStyle.Bottom;
MainTJChart.Series[0].Points[1].CustomProperties = "LabelStyle=Bottom";

源代码如下。

 using System.Windows.Forms.DataVisualization.Charting;

//程序集 System.Windows.Forms.DataVisualization.dll, v4.0.30319
/// <summary>
/// 生成柱状图,将图片绑定到Image.Source上。
/// </summary>
/// <param name="image"></param>
/// <param name="speedList"></param>
/// <returns></returns>
public static void InitChartImgScC(System.Windows.Controls.Image image)
{
    // 生成报表的代码
    Chart MainTJChart = new Chart() { Width = 570, Height = 350 };
    MainTJChart.ChartAreas.Clear();
    MainTJChart.ChartAreas.Add(new ChartArea("C1"));
    MainTJChart.Series.Clear();
    MainTJChart.Series.Add(new Series("S1") { ChartArea = "C1" });
    //设置图标显示样式
    foreach (var item in MainTJChart.ChartAreas)
    {
        item.CursorX.AutoScroll = true;
        item.AxisX.ScaleView.Zoomable = false;
        item.AxisX.MajorGrid.Enabled = false;//图表内的线
        item.AxisX.Enabled = AxisEnabled.False; //图标的刻度开关
        item.AxisY.Interval = 0;
        item.AxisX.IsMarginVisible = false; //设置IsMarginVisible为false
        item.AxisY.MajorGrid.Enabled = false;//图表内的线
        item.AxisY.Enabled = AxisEnabled.False;//图标的刻度开关
    }
   
    MainTJChart.Series[0].ChartType = SeriesChartType.RangeColumn;
    MainTJChart.Series[0]["PixelPointWidth"] = "35"; // 设置柱状宽度
    MainTJChart.Series[0]["PointWidth"] = "5"; // 设置柱状之间的距离间隙
    //添加数据
    MainTJChart.Series[0].Points.AddXY("项目1", 200);
    MainTJChart.Series[0].Points.AddXY("项目2", 140);
    MainTJChart.Series[0].Points.AddXY("项目3", 150);
    MainTJChart.Series[0].Points.AddXY("项目4", 10);
    MainTJChart.Series[0].Points.AddXY("项目5", 90);
    MainTJChart.Series[0].Points.AddXY("项目6", 100);
    MainTJChart.Series[0].Points.AddXY("项目7", 150);
    MainTJChart.Series[0].Points[0].Label = "项\n\n1\n\n\n示";
    MainTJChart.Series[0].Points[1].Label = "休\n\n\n间";
    MainTJChart.Series[0].Points[2].Label = "测\n\n\n据";
    MainTJChart.Series[0].Points[3].Label = "数\n\n\n式";
    MainTJChart.Series[0].Points[4].Label = "显\n\n\n间";
    MainTJChart.Series[0].Points[5].Label = "息\n\n间";
    MainTJChart.Series[0].Points[6].Label = "你\n\n\n间";
    //设置数据格式
    foreach (var item in MainTJChart.Series[0].Points)
    {
        //item.CustomProperties = "LabelStyle=Bottom";
        item.Color = System.Drawing.Color.FromArgb(0xFF, 0xCC, 0x00);
        item.Font = new Font("Arial", 11);
    }
    //生成图片并绑定到Image
    Bitmap bitmap = null;
    IntPtr intPtr = new IntPtr();
    try
    {
        bitmap = new Bitmap(MainTJChart.Width, MainTJChart.Height);
        MainTJChart.DrawToBitmap(bitmap, new Rectangle(0, 0, MainTJChart.Width, MainTJChart.Height));
        intPtr = bitmap.GetHbitmap();
        image.Stretch = Stretch.Uniform;
        image.Source = Imaging.CreateBitmapSourceFromHBitmap(intPtr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        if (bitmap != null) { bitmap.Dispose(); }
        if (intPtr != IntPtr.Zero) { DeleteObject(intPtr); }
    }
}

然后显示的效果如下图

img

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-13 17:19
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    为了使柱状图的标签文字与底部对齐,你需要调整 LabelStyleLabelAlignment 属性。在你的代码中,你确实设置了 LabelStyle=Bottom,但是没有设置正确的 LabelAlignment。对于 RangeColumn 类型的图表,可能需要进一步调整坐标轴区域(ChartArea)和系列(Series)的相关属性。

    尝试修改如下:

    // 设置所有点的标签样式为底部,并且水平居中对齐
    foreach (var point in MainTJChart.Series[0].Points)
    {
        point.Label = point.YValues[0].ToString(); // 假设你想显示的是Y值
        point.LabelForeColor = System.Drawing.Color.Black; // 标签颜色
        point.LabelBackColor = System.Drawing.Color.WhiteSmoke; // 标签背景色
        point.LabelFormat = ""; // 清除默认格式化以便直接显示文本内容
        point.LabelAngle = 0; // 确保标签角度为0,即水平显示
        point.LabelAlignment = ContentAlignment.BottomCenter; // 这里使用ContentAlignment而不是StringAlignment
        point.LabelStyle = LabelStyle Below;
    }
    
    // 调整AxisX的最小值和最大值,确保标签有足够的空间显示在底部
    MainTJChart.ChartAreas[0].AxisX.Minimum = -1;
    MainTJChart.ChartAreas[0].AxisX.Maximum = MainTJChart.Series[0].Points.Count + 0.5;
    
    // 防止标签重叠,可以增加标签间距
    MainTJChart.ChartAreas[0].AxisX.IsMarginVisible = true;
    MainTJChart.ChartAreas[0].AxisX.LabelAutoFitMinFontSize = 8; // 自动调整字体大小以适应空间
    MainTJChart.ChartAreas[0].AxisX.LabelAutoFitStyle = LabelAutoFitStyles.None;
    MainTJChart.ChartAreas[0].AxisX.Interval = 1; // 每个刻度间隔为1(对应一个项目)
    
    // 确保图表区域足够大,容纳下底部对齐的标签
    MainTJChart.ChartAreas[0].InnerPlotPosition.Height = 90; // 可适当调整这个值
    
    

    由于 LabelAlignmentSystem.Windows.Forms.DataVisualization.Charting 中实际使用的类型是 ContentAlignment,而非 StringAlignment,所以这里做了相应修改。同时,我们还需要通过调整坐标轴的范围来确保标签有足够的空间显示在底部,并防止标签重叠。

    另外,请注意,上述代码片段基于.NET Framework中的WinForms Chart控件进行编写,如果你是在WPF环境下使用System.Windows.Controls.DataVisualization.Charting的话,部分属性名称和用法可能会有所不同。如果是在WPF环境中,你可能需要查找对应的WPF版Chart控件的属性设置方法。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 创建了问题 3月13日

悬赏问题

  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询