动态生成折线图

该博客为转载内容,转载自https://www.cnblogs.com/pblee/archive/2005/11/15/276549.html ,涉及UI相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class PrintTable : System.Web.UI.Page
    {
        
private void Page_Load(object sender, System.EventArgs e)
        {
            
if(Session["chuzulv"]!=null)
            {
                
//数据源
                Table table=(Table)Session["Chuzulv"];

                
//可修改属性
                int Height=300;                                //图像高度
                int Width=500;                                //图像宽度
                string TableName="物资出租率";                //表头
                Font TableHeaderFont=new Font("宋体",12);    //表头字体
                float High=100;                                //默认最大标尺
                float Low=0;                                //默认最小标尺
                Color BGColor=Color.Black;                    //背景色
                Color HLineColor=Color.DarkCyan;            //横向表格线颜色
                Color LineColor=Color.WhiteSmoke;            //曲线颜色

                
//临时属性不可修改
                Bitmap bm = new Bitmap(Width,Height);        //图像对象
                Graphics g = Graphics.FromImage(bm);        //绘图对象
                StringFormat drawFormat = new StringFormat();//纵向文字输出格式
                drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;

                SolidBrush br
=new SolidBrush(Color.Red);    //Brush,红色
                Pen p =new Pen(Color.Red,1);                //Pen,红色,宽度1
                g.Clear(BGColor);                            //绘制背景色
                g.DrawString(TableName,TableHeaderFont,br,new Point(0,0)); //绘制表头
                int HStep = (Width - 30/ (table.Rows.Count - 1);                //横向步长(每日期)
                int VStep;                                    //纵向步长(每百分点)
                int index=0;                                //临时标示记录索引
                foreach(TableRow r in table.Rows)
                {
                    index
++;
                    
if (index == 1)                            //过滤数据源第一行Header
                        continue;
                    
if (r.Cells[5].Text != "" && float.Parse(r.Cells[5].Text) > High)    //重新获取纵座标上下限
                        High = float.Parse(r.Cells[5].Text);
                    
if (r.Cells[5].Text != "" && float.Parse(r.Cells[5].Text) < Low)
                        Low 
= float.Parse(r.Cells[5].Text);
                }
                High 
+= (High % 10 == 0? 0 : 10 - High % 10;//上下限对齐
                Low -= (Low % 10 == 0? 0 : 10 + Low % 10;
                VStep 
= (Height - 50/ (int)(High - Low);    //获取纵向步长

                Point lineStartPoint;                        
//曲线起始点
                Point lineEndPoint;                            //曲线终止点
                int BaseVHeight=0;                            //0点纵坐标
                int Vertical=30;                            //横向参考线最高点
                for(float HLine = High ; HLine >= Low ;HLine -= 10)        //绘制横向辅助线
                {
                    g.DrawLine(
new Pen(Color.DarkCyan,1),new Point(20,Vertical),new Point(Width,Vertical));
                    g.DrawString(HLine.ToString()
+"%",new Font("宋体",8),br,new Point(5,Vertical - VStep ));
                    
if(HLine==0)                            
                        BaseVHeight
=Vertical;
                    Vertical 
+= VStep * 10;
                }
                Point startPoint
=new Point(0,Height-50);
                startPoint.X 
+= 10 ;
                
                lineStartPoint
=new Point(startPoint.X  + HStep / 2,BaseVHeight);

                index 
= 0;
                
float PerCent=0;
                
foreach(TableRow r in table.Rows)
                {
                    index
++;
                    g.DrawString(r.Cells[
0].Text,new Font("宋体",8),br,startPoint,drawFormat);
                    
if (index == 1)
                        startPoint.X 
+= 20;
                    
else
                        startPoint.X 
+= HStep;
                    
if (r.Cells[5].Text != "")
                        
if (index == 1)
                            
continue;
                        
else 
                            PerCent 
= float.Parse(r.Cells[5].Text);
                    
else
                        PerCent 
= 0;
                    
if (index == 2)
                        lineStartPoint
=new Point(startPoint.X - HStep ,BaseVHeight - (int)PerCent * VStep);
                        
                    lineEndPoint 
= new Point(startPoint.X - HStep,BaseVHeight - (int)PerCent * VStep);
                    g.DrawLine(
new Pen(Color.WhiteSmoke,1),lineStartPoint,lineEndPoint);
                    
                    lineStartPoint 
= lineEndPoint;
                }
                
//输出
                bm.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Gif);
                
//清除对象
                ((Table)Session["chuzulv"]).Dispose();
                Session[
"chuzulv"]=null;
            }
        }
补充一下Session[]==null;无法清除Session对象
还要用Session.Remove(*)来清除

因为报表不需要交互,所以一直用Table,

前一个页统计出Table之后存入Session["chuzulv"],然后置一Image控件,ImageUrl属性指向此页面

效果如图,上传时压缩了品质,动态生成的Gif效果很不错

table.JPG

转载于:https://www.cnblogs.com/pblee/archive/2005/11/15/276549.html

### 如何使用MPAndroidChart库动态生成折线图 为了实现动态更新的折线图,可以利用`MPAndroidChart`中的数据集和图表刷新机制。下面是一个具体的例子来展示如何创建并实时更新一个折线图。 #### 初始化LineChart组件 首先,在布局文件中定义`<com.github.mikephil.charting.charts.LineChart>`视图,并通过Java/Kotlin代码获取其实例: ```java // 获取LineChart对象引用 LineChart lineChart = findViewById(R.id.line_chart); lineChart.getDescription().setEnabled(false); // 关闭描述文字 lineChart.setTouchEnabled(true); // 启用触摸交互 lineChart.setDragDecelerationFrictionCoef(0.9f); lineChart.setScaleXEnabled(true); // 设置X轴缩放比例可变 lineChart.setScaleYEnabled(false); // Y轴固定不可缩放 lineChart.setPinchZoom(false); // 禁止双指缩放 ``` #### 创建数据集与条目列表 接着准备要显示的数据集合以及对应的标签数组: ```java ArrayList<Entry> entries = new ArrayList<>(); for (int i = 0; i < count; i++) { float val = (float) (Math.random() * range) + yMin; entries.add(new Entry(i, val)); } LineDataSet dataSet = new LineDataSet(entries, "Label"); // 添加名称作为图例 dataSet.setColor(Color.rgb(255, 87, 51)); // 颜色设置 dataSet.setValueTextColor(Color.BLACK); // 文字颜色 dataSet.setValueTextSize(10f); // 字体大小 dataSet.setDrawCircles(false); // 不绘制圆圈标记点 dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER); // 使用贝塞尔曲线连接各点 dataSet.setLineWidth(2f); // 曲线宽度 ``` #### 更新图表数据 当有新的数据到来时,可以通过向现有数据集中追加新条目的方式来进行增量式的图表更新操作: ```java public void addEntry(float value){ int index = lineData.getEntryCount(); List<IValueFormatter> vals = ((LineDataProvider)lineChart).getValues(); ILineDataSet set = lineData.getDataSetByIndex(0); if(set == null || !(set instanceof LineDataSet)){ throw new IllegalStateException("No dataset found!"); } Entry entry = new Entry(index,value); set.addEntry(entry); set.notifyDataSetChanged(); lineData.notifyDataChanged(); lineChart.notifyDataSetChanged(); lineChart.setVisibleXRangeMaximum(60); // 只保留最近60个时间单位内的记录 lineChart.moveViewToX(data.getXValCount()); // 移动到最新位置处查看最新的数据变化趋势 } ``` 以上就是关于怎样借助于`MPAndroidChart`这个强大的第三方开源库实现在安卓应用里构建能够随时间推移而自动滚动播放的历史走势分析图形界面控件的一个简单介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值