Chart绘图

我们直接拖放控件到页面,生成如下代码:

<asp:Chart ID="Chart2" runat="server">
  <Series>
    <asp:Series Name="Series1">
    </asp:Series>
  </Series>
  <ChartAreas>
    <asp:ChartArea Name="ChartArea1">
    </asp:ChartArea>
  </ChartAreas>
</asp:Chart>


现在,只要我们在后台为控件绑定数据源,就可以生成一个让人"比较满意"的图表了!
绑定数据代码如下:

OleDbConnection conn=ConnDB.CreatetoOleDbConn();
        OleDbCommand cmd=new OleDbCommand("select * from chart order by mMonth",conn);
        conn.Open();
        OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        //绑定到数据源Chart控件
        this.Chart1.DataBindCrossTable(dr, "mShopping", "mMonth", "mMoney", "Label=mMoney{C}");
        dr.Close();
        conn.Close();


这里需要留意的就是DataBindCrossTable函数了,其原型如下:

public void DataBindCrossTable(
  IEnumerable dataSource,    //需要绑定的数据源:可以是以下类型:
                //  OleDbDataReader, SqlDataReader或者DataView
                //---对应上面的OleDbDataReader
  string seriesGroupByField,  //分组数据的字段名:---对应店名:mShopping
  string xField,        //X轴数据的字段名:----对应销售日期:mMonth
  string yFields,        //Y轴数据的字段名:----对应当日的销售额:mMoney
  string otherFields      //其他的需要绑定的数据,
        //格式为: 点属性=Field[{Format}] [,PointProperty= Field[{Format}]]
        //例如:"Tooltip=Price{C1},Href=WebSiteName".
);

public void DataBindCrossTable(
  IEnumerable dataSource,
  string seriesGroupByField,
  string xField,
  string yFields,
  string otherFields,
  PointSortOrder sortingOrder  //指定了每组数据的顺序
);

生成的图表如下:
点击在新窗口中浏览此图片

但是我们不知道这里的色块代表什么,因为没有图示,所以我们就需要自己动手了,在前台的代码里添加上:

<legends>
  <asp:legend LegendStyle="Row" IsTextAutoFit="False" Docking="Bottom" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 8.25pt, style=Bold" Alignment="Center"></asp:legend>
</legends>

点击在新窗口中浏览此图片

再运行一下看看,图示出来了,发现前面多了一个"Series1",好了,我们把前台代码里的Series1段删除掉看看:

<asp:Chart ID="Chart1" runat="server">
  <legends>
    <asp:legend LegendStyle="Row" IsTextAutoFit="False" Docking="Bottom" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 8.25pt, style=Bold" Alignment="Center"></asp:legend>
  </legends>
  <ChartAreas>
    <asp:ChartArea Name="ChartArea1">
    </asp:ChartArea>
  </ChartAreas>
</asp:Chart>


OK了,现在我们再为图表添加一个背景,再调整一个宽度和高度,调整后的代码完整如下:

<asp:Chart ID="Chart1" runat="server" Width="412px" Height="296px">
  <legends>
    <asp:legend LegendStyle="Row" IsTextAutoFit="False" Docking="Bottom" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 8.25pt, style=Bold" Alignment="Center"></asp:legend>
  </legends>
  <borderskin skinstyle="Emboss"></borderskin>
  <ChartAreas>
    <asp:ChartArea Name="ChartArea1">
    </asp:ChartArea>
  </ChartAreas>
</asp:Chart>

点击在新窗口中浏览此图片

嗯,感觉好看多了.但是我们不想柱形图表,那样不够直接,我们想要曲线图!
这时,我们需要在后台代码里添加设置了,具体如下:

foreach (Series ser in Chart1.Series)
{
  //注意:需要引用空间
  //    using System.Web.UI.DataVisualization.Charting;
  ser.ChartType = SeriesChartType.Spline; //设置图表样式
}


一个简单的循环遍历帮我们达成了任务.
这里我们需要明白的是,对于一个图表来说,第一组数据就是Series序列,这些都存储在了Chart的Series属性里!
Chart1.Series是一个数组(或者说是一个关联数组,你可以对Series命名,然后通过name来索引.
这里我去掉上面的代码,仅设置了一个Series的样式:

Chart1.Series[0].ChartType = SeriesChartType.Line;

保存,然后运行,哈,就了柱形与曲线的混合图表了!!
点击在新窗口中浏览此图片

如果我们要设置更多的样式,我们可以详细设置一下Series的属性:

//注意:需要引用如下命名空间:
/*
* using System.Drawing;
* using System.Drawing.Text;
* using System.Drawing.Imaging;
* using System.Web.UI.DataVisualization.Charting;
*/
MarkerStyle marker = MarkerStyle.Star4; //设置坐标点的样式
foreach (Series ser in Chart.Series)
{
  ser.ShadowOffset = 2;
  ser.BorderWidth = 2;
  ser.ChartType = SeriesChartType.Spline; //设置
  ser.MarkerSize = 12;
  ser.MarkerStyle = marker;   //坐标点
  ser.MarkerBorderColor = Color.FromArgb(64, 64, 64);
  ser.Font = new Font("Trebuchet MS", 8, FontStyle.Bold);
  marker++;
}


各个属性的说明,大家可以查阅一下相关的文档说明,还是很容易就明了的!
如果我们想看某一家店当月每天在当月销售中所在的比例呢?这时用一个"饼状图"来展示就很清晰了.
我们在前台再添加一个Chart:

<asp:Chart ID="Chart2" runat="server" Width="412px" Height="296px">
  <legends>
    <asp:legend IsEquallySpacedItems="True" IsTextAutoFit="False" Docking="Right" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 8.25pt, style=Bold"></asp:legend>
  </legends>
  <borderskin skinstyle="Emboss"></borderskin>
  <Series>
    <asp:Series Name="Series1">
    </asp:Series>
  </Series>
  <ChartAreas>
    <asp:ChartArea Name="ChartArea1">
    </asp:ChartArea>
  </ChartAreas>
</asp:Chart>


然后继续在后台绑定数据,并稍加设置就OK了:

cmd = new OleDbCommand("select * from chart where mShopping='s001' order by mMonth asc",conn);
OleDbDataReader dr2 = cmd.ExecuteReader();
Chart2.Series[0].Points.DataBind(dr2, "mMonth", "mMoney", "");/*#PERCENT{}*/
Chart2.Series[0].ChartType = SeriesChartType.Pie;
Chart2.Series[0].LegendText = "#AXISLABEL";
Chart2.Series[0].Label = "#PERCENT{P1}";
Chart2.Series[0].ToolTip = "#AXISLABEL #VALY{C}";

点击在新窗口中浏览此图片

需要注意的是,如果"mMonth"字段也是数值的话,这时:

Chart2.Series[0].LegendText = "#AXISLABEL";这个设置可能就无效了,图示会也显示为百分比!


样式:

            foreach (Series ser in this.chLineChart.Series)
            {
                MarkerStyle marker = MarkerStyle.Circle; //设置坐标点的样式
                ser.BorderWidth = 2;
                ser.ChartType = SeriesChartType.Spline; //设置
                ser.MarkerSize = 12;
                ser.MarkerStyle = marker;   //坐标点
                ser.MarkerBorderColor = Color.FromArgb(64, 64, 64);
                ser.Font = new Font("Trebuchet MS", 8, FontStyle.Bold);
                marker++;
            }


以上为转载
Tip
:绘制柱状图时,会从不是0的数据开始画,如:时间是2013-04~2013-09,只有08月有数据,那么08月的柱子会到04月那里,so要用日期左

关联数据,没有数据的月份用0表示出来,如是多柱状图显示,那么在数据源是分别查询,用union连接数据集。绘制折线图时,当有多条折线时,需

分别绘制。
当有关文件夹报错时,检查web.config是否有

<appSettings>
    <add key="ChartImageHandler" value="storage=file;timeout=20;Url=../TJChart/TempImageFiles/;" />
</appSettings>
及对应的文件夹,该文件夹为缓存图片文件夹,建议新建一个文件在里面,因为在发布时空文件夹会被认为是无效文件夹不生成的。具体的数据绑定方法,

在C#中有,不解释。


### 回答1: Qt Chart是一个用于创建漂亮的图表和图形的开源工具包,它可以绘制多种图表类型,如线性图、散点图、饼图等。如果想要将某些点替换为图片,则需要以下几个步骤: 1. 加载图片文件:首先需要使用Qt内置的QImage类,或者其他第三方库,如OpenCV等,来加载要替换的图片文件。可以使用QPixmap将QImage转换为可以在Qt界面中显示的图像。 2. 构造替换点:要替换的点需要在Qt Chart中使用QScatterSeries进行绘图。可以使用QPointF类来构造点的坐标,并使用QVariant类来存储要替换的图片信息。 3. 绘制替换点:使用QChart类创建图表,并使用QScatterSeries来添加替换点。在添加点时,需要使用QChart的addSeries()函数,并设置点的样式、大小、颜色等属性。在替换点的样式中,可以设置为QPixmap,使得要替换的图片可以显示在替换点的位置上。 4. 打开图表:通过QChartView类将QChart添加到QWidget中,并显示在Qt界面中。 总之,要将Qt Chart中的点替换为图片,只需要将要替换的图片加载到Qt中,构造替换点,并使用QScatterSeries进行替换点的绘制,最后使用QChartView将图表显示出来即可。 ### 回答2: Qt Chart是Qt的图表库,可以用来绘制各种类型的图表,如条形图、饼图、散点图等。经常会遇到需要将点替换为图片的情况,比如在地图上显示各个地点的标志,或者在散点图上显示各个数据点的图标。 要在Qt Chart中将点替换为图片,首先需要创建一个QScatterSeries对象来表示散点图,并将每个点的图像设置为图片。可以使用QPixmap类加载一个图片文件,然后将其设置为每个散点的图标。 例如,下面的代码演示了如何将一个星型的图片作为每个散点的图标: ``` QScatterSeries *series = new QScatterSeries(); for(int i = 0; i < numDataPoints; ++i) { QPixmap pixmap(":/star.png"); series->append(QPointF(xValues[i], yValues[i]), pixmap); } QChart *chart = new QChart(); chart->addSeries(series); ``` 其中,`numDataPoints`是数据点的数量,`xValues`和`yValues`是对应的x和y坐标。`":/star.png"`是图片文件的路径,可以根据实际情况替换为其他图片。`append()`函数将每个坐标点和对应的图片添加到散点图中。 需要注意的是,如果每个图片都很大,可能会影响绘制的性能和速度。因此,可以在加载图片时缩小它们的大小,或者使用更小的图标。也可以尝试使用其他更高效的绘图库或技术来实现复杂的图表效果。 ### 回答3: 在Qt Chart中,可以通过继承QScatterSeries类来实现将点替换为图片的功能。 首先,我们需要准备好要替换的图片,可以使用QPixmap类创建或加载一张图片,如下所示: QPixmap pixmap("image.png"); 然后,在继承的类的构造函数中,需要调用setBrush函数来设置每个点的brush为对应的图片,如下所示: MyScatterSeries::MyScatterSeries(QObject *parent) : QScatterSeries(parent) { QPixmap pixmap("image.png"); QBrush brush(pixmap); setBrush(brush); } 最后,在调用此类的代码中,将该类对象添加到chart中即可,如下所示: MyScatterSeries *series = new MyScatterSeries(); series->append(0, 0); series->append(1, 1); chart->addSeries(series); 这样,我们就成功将点替换为了对应的图片。同时,也可以根据需要设置图片的大小和形状等参数,具体可参考Qt官方文档和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值