Y轴的标签是AxisTitle,WPF平台下,可以放个TextBlock在这个位置。代码参考:
<c1:C1ChartView><c1:ChartView>
<c1:ChartViewAxisY>
<c1:Axis>
<c1:AxisTitle>
<TextBlock Text="单位:万元" TextAlignment="Center" Foreground="Crimson"/>
</c1:AxisTitle>
</c1:Axis>
</c1:ChartViewAxisY>
</c1:ChartView>
</c1:C1ChartView>
HTML部分:
<asp:Chart ID="ChartBar" runat="server" Width="800px" BackColor="#FFFFCC" Palette="BrightPastel" BorderWidth = "2" BorderColor = "#cc9900" >
<Legends>
<asp:Legend IsTextAutoFit="False" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 825pt, style=Bold">
</asp:Legend>
</Legends>
<ChartAreas>
<asp:ChartArea Name="ChartArea1">
</asp:ChartArea>
</ChartAreas>
</asp:Chart>
<asp:Chart ID="ChartPie" runat="server" Width="400px" BackColor="#FFFFCC" Palette="BrightPastel" BorderWidth = "0" BorderColor = "#cc9900" >
<Legends>
<asp:Legend IsTextAutoFit="False" Name="Default" BackColor="Transparent" Font="Trebuchet MS, 825pt, style=Bold">
</asp:Legend>
</Legends>
<ChartAreas>
<asp:ChartArea Name="ChartArea1">
</asp:ChartArea>
</ChartAreas>
</asp:Chart>
C#部分:
//获取每月销售情况
int[] arraySell=new int[]{10};
//获取月份
string[] arrayMonths = new string[] { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
//获取部门
string[] arrayDeparts = new string[] { "部门1", "部门2", "部门3" };
Series seriess = new Series("销售情况");
seriessBorderWidth = 3;
seriessShadowOffset = 2;
Series seriesPies = new Series("销售情况");
seriesPiesChartType = SeriesChartTypePie;
seriesPiesBorderWidth = 3;
seriesPiesShadowOffset = 2;
thisChartBarSeriesAdd(seriess);
thisChartPieSeriesAdd(seriesPies);
Title tBar = new Title("销售情况柱状图");
thisChartBarTitlesAdd(tBar);
Title tPie = new Title("销售情况饼状图");
thisChartPieTitlesAdd(tPie);
thisChartBarChartAreas["ChartArea1"]AxisXInterval = 1;//x轴数据显示间隔
thisChartBarChartAreas["ChartArea1"]AxisYInterval = 50;
//画柱状图
foreach (string d in arrayDeparts)
{
Series tempseries = new Series(stringFormat("{0}", d));
thisChartBarSeriesAdd(tempseries);
foreach (string m in arrayMonths)
{
foreach (int n in arraySell)
{
tempseriesPointsAddXY(m, n);
}
}
}
//画饼图
foreach (string d in arrayDeparts)
{
foreach(int n in arraySell)
{
seriesPiesPointsAddXY(d, n);
}
}
thisChartBarChartAreas["ChartArea1"]AxisXIsMarginVisible = false;
thisChartBarChartAreas["ChartArea1"]Area3DStyleEnable3D = false;
//背景色设置
thisChartBarChartAreas["ChartArea1"]ShadowColor = ColorTransparent;
thisChartBarChartAreas["ChartArea1"]BackColor = ColorAzure;
thisChartBarChartAreas["ChartArea1"]BackGradientStyle = GradientStyleTopBottom;
thisChartBarChartAreas["ChartArea1"]BackSecondaryColor = ColorWhite;
//X,Y坐标线颜色和大小
thisChartBarChartAreas["ChartArea1"]AxisXLineColor = ColorBlue;
thisChartBarChartAreas["ChartArea1"]AxisYLineColor = ColorBlue;
thisChartBarChartAreas["ChartArea1"]AxisXLineWidth = 2;
thisChartBarChartAreas["ChartArea1"]AxisYLineWidth = 2;
thisChartBarChartAreas["ChartArea1"]AxisYTitle = "销量";
//中间X,Y线条的颜色设置
thisChartBarChartAreas["ChartArea1"]AxisXMajorGridLineColor = ColorBlue;
thisChartBarChartAreas["ChartArea1"]AxisYMajorGridLineColor = ColorBlue;
//XY轴数据显示间隔
thisChartBarChartAreas["ChartArea1"]AxisXInterval = 1; //X轴数据显示间隔
thisChartBarChartAreas["ChartArea1"]AxisYInterval = 50;
//X轴线条显示间隔
thisChartBarChartAreas["ChartArea1"]AxisXMajorGridInterval = 1;
效果如下
可以看出你需要的是在X轴使用缩放视图时自动根据显示区域内数据点的Y值范围对Y轴也进行缩放。
这里需要着重考虑几个问题。
X轴缩放后我们需要找出X值在此区域的数据点,才能计算出这些数据点的Y值的最大值和最小值。
进行Y轴缩放时应该加入一个微调值,避免出现最小Y值触碰视图区域底部和最大Y值触碰视图区域顶部。
进入缩放视图后,如果用户在X轴上进行了滚动操作,应该根据设置决定是否立刻对Y轴缩放视图进行重新计算。
这里的核心代码并不多,下面列出:
private void ZoomInternal(double xStart, double xEnd, Series singleSeries)
{
ChartArea area = thisChartAreas[singleSeriesChartArea];
//放大X轴为start到end区间的部分图表
areaAxisXScaleViewZoom(xStart, xEnd);
if (viewZoomAutoLinkage)
{
//计算此视图上所有point的Y值(每个点可能有多个Y值),得到X值在范围内的所有点的所有Y值
//这里的points是List<double[]>结构
var points = (from p in singleSeriesPoints
where pXValue <= xEnd && pXValue >= xStart
select pYValues)ToList();
//展开所有Y值得到最小和最大值。这里我们使用Lambda完成嵌套的Min计算
//对每一个Y值集合计算最小值作为该集合的比较值,然后抽取所有集合中的最小值
if (pointsAny())
{
double yStart = pointsMin<double[]>(yValues => yValuesMin());
double yEnd = pointsMax<double[]>(yValues => yValuesMax());
//放大Y轴到yStart,yEnd范围
areaAxisYScaleViewZoom(yStart-viewZoomYFix, yEnd+viewZoomYFix);
}
}
}
因为你提及的这个问题可能我项目中也会用到,这里顺手继承了一下Chart控件,解决了上面列出的三个问题。下面是一个自定义Chart控件的源码。请直接使用或修改。使用时请先设置其两个自定义的公有属性bool ViewZoomAutoLinkage和double ViewZoomYFix。
using System;using SystemLinq;
using SystemWindowsFormsDataVisualizationCharting;
namespace Utils
{
public partial class MyChart : Chart
{
private bool viewZoomAutoLinkage = false;
//是否使用联动缩放
public bool ViewZoomAutoLinkage
{
get { return viewZoomAutoLinkage; }
set { viewZoomAutoLinkage = value; }
}
private double viewZoomYFix;
//联动缩放Y轴时对最大Y和最小Y的修正。修正为YMax+Fix和YMin-Fix。
//为确保放大后的YMax和YMix不会触及区域顶端/底端,请使用合适的Fix值适当扩大Y轴视图范围
//例:Y轴间隔为2,使用Fix=1较为合适。
public double ViewZoomYFix
{
get { return viewZoomYFix; }
set { viewZoomYFix = value; }
}
public MyChart()
{
thisAxisViewChanged += new EventHandler<ViewEventArgs>(LinkageZoom);
}
private void ZoomInternal(double xStart, double xEnd, Series singleSeries)
{
ChartArea area = thisChartAreas[singleSeriesChartArea];
//放大X轴为start到end区间的部分图表
areaAxisXScaleViewZoom(xStart, xEnd);
if (viewZoomAutoLinkage)
{
//计算此视图上所有point的Y值(每个点可能有多个Y值),得到X值在范围内的所有点的所有Y值
//这里的points是List<double[]>结构
var points = (from p in singleSeriesPoints
where pXValue <= xEnd && pXValue >= xStart
select pYValues)ToList();
//展开所有Y值得到最小和最大值。这里我们使用Lambda完成嵌套的Min计算
//对每一个Y值集合计算最小值作为该集合的比较值,然后抽取所有集合中的最小值
if (pointsAny())
{
double yStart = pointsMin<double[]>(yValues => yValuesMin());
double yEnd = pointsMax<double[]>(yValues => yValuesMax());
//放大Y轴到yStart,yEnd范围
areaAxisYScaleViewZoom(yStart-viewZoomYFix, yEnd+viewZoomYFix);
}
}
}
//唯一个公有方法,对指定范围的X轴区域进行缩放。关联属性会决定是否同时缩放Y轴。使用默认的series参数会对所有序列进行操作,否则只缩放指定的序列。
public void Zoom(double xStart, double xEnd, Series series = null)
{
if (series == null)
foreach (Series s in thisSeries)
ZoomInternal(xStart, xEnd, s);
else if (thisSeriesContains(series))
ZoomInternal(xStart, xEnd, series);
else
throw new Exception("This chart DO NOT contains parameter-specificed series");
}
private void LinkageZoom(object sender, ViewEventArgs vea)
{
//如果滚动了X滚动条,应重新计算Y值范围并进行Y放大这里不考虑第二条X轴(X2)
if (viewZoomAutoLinkage && veaAxisAxisName == AxisNameX)
{
double xStart = veaChartAreaAxisXScaleViewViewMinimum;
double xEnd = veaChartAreaAxisXScaleViewViewMaximum;
xStart = veaNewPosition;
xEnd = veaNewPosition + veaNewSize;
//找出哪些序列绑定了事件参数中的轴所在的Area
var sList = thisSeriesWhere(s => sChartArea == veaChartAreaName);
if (sListAny())
foreach (var s in sList)
Zoom(xStart, xEnd, s);
}
}
}
}
使用时:
myChart1ViewZoomAutoLinkage = true;
myChart1ViewZoomYFix = 1;
myChart1Zoom(3,5,myChart1Series[0]);
使用效果:
这里添加了一系列数据点,风格等属性使用了默认。
原始数据图:
应用X轴3~5缩放视图后:
拖动X滚动条后:
最后是附件,编译过的用户控件链接库。使用时直接项目引用然后在工具箱里找就好。
注意自己编译的话,请新建-用户控件,复制代码,修改命名空间。用户控件的MyChartDesignercs文件请删除编译错误的一行(Chart不支持AutoScale属性),敬请注意。
1、QChart的设置
QChart是组合图表各部分、显示各种数据序列的绘图组件。QChart接口函数众多,其主要接口函数分类整理后见下表。对于一个属性,通常有一个设置函数和一个对应的读取函数,如setTitle()用于设置图表标题,对应的读取图表标题的函数为title()。
分组 函数名 功能描述
图表外观
void setTitle()
void setTitIeFont()
void setTitleBrush()
void setTheme()
void setMargins()
QLegend legend()
void setAnimationOptions()
设置图表标题显示在图表上方,支持HTML格式
设置图表标题字体
设置图表标题画刷
设置主题,主题是内置的UI设置,定义了图表的配色
设置绘图区与图表边界的4个边距
返回图表的图例
设置序列或坐标轴的动画效果
数据序列
void addSeries()
QList< QAbstractSeries > series()
void removeSeries()
void removeAIISeries()
添加序列
返回图表拥有的序列的列表
移除-个序列,但并不删除序列对象
移除并删除图表的所有序列
坐标轴
void addAxis()
QList axes()
void setAxisX()
void setAxisY()
void removeAxis()
void createDefaultAxes()
为图表的某个方向添加坐标轴
返回某个方向的坐标轴列表
设置某个序列的水平方向的坐标轴
设罝某个序列的垂直方向的坐标轴
移除一个坐标轴
根据己添加的序列的类型,创建缺省的坐标轴,前面已有的坐标轴会被删除
图表的设置和曲线的设置如下图
setAnimationOptions(AnimationOptions options)函数设置图表的动画效果,输入参数是QChart::AnimationOptions枚举类型,有以下几种取值
QChart::NoAnimation---- 无动画效果
QChart::GridAxisAnimations---- 背景网格有动画效果:
QChart::SeriesAnimations---- 序列有动画效果:
QChart::AllAnimations—-—都有动画效果
主题是预定义的图表配色样式,是QChart::ChartTheme枚举类型,有多种取值,使图表具有 不同的配色效果
图例是一个QLegend类的对象,通过QChart::legend()可以获得图表的图例图例是根据添加的序列自动生成的,但是可以修改图例的一些属性,如在图表中的显示位置、图例文字的字体等。例如,设置图例显示在图表的底部可用下面的语句:
uichartView->chart()->legend()->setAlignment(Qt::AlignBottom);
登录后复制
设置图例文字的字体的代码如下:
void MainWindow::on_btnLegendFont_clicked(){
//图例的字体设置
QFont font=ui->chartView->chart()->legend()->font();
bool ok=false;
font=QFontDialog::getFont(&ok,font);
if (ok)
uichartView->chart()->legend()->setFont(font);
}
登录后复制
2、 QLineSeries 序列的设置
QLineSeries的主要函数见下表
分组
函数 功能描述
序列名称 void setName() void setName()
图表 QChart chart() 返回序列所属的图表对象
序列外观
void setVisibte()
void show()
void hide()
void setColor()
void setPen()
void setBrush()
void setOpacity()
设置序列可见性
显示序列,使序列可见
隐藏序列,使序列不可见
设置序列线条的颜色
设置绘制线条的颜色
设置绘制数据点的画刷
设置序列的透明度,0表示完全透明,1表示不透明
数据点
void setPointsVisible()
void append()
void insert()
void replace()
void clear()
void remove()
void removePoints()
int count()
QPointF& at()
QList<QPointF> points()
QVetor<QPointF> pointsVector()
设置数据点的可见性
添加一个数据点到序列
在某个位置插入一个数据点
替换某个数据点
清除所有数据点
删除某个数据点
从某个位置开始,删除指定个数的数据点
数据点的个数
返回某个位置上的数据点
返回数据点的列表
返回数据点的列表,效率更高
数据点标签
void setPointLabeIsVisible()
void setPointLabelsColor()
void setPointLabelsFont()
void setPointLabelsFormat()
void setPointLabelsClipping()
设置数据点标签的可见性
设置数据点标签的文字颜色
设置数据点标签字体
设置数据点标签格式
设置标签的裁剪属性,缺省为True,即绘图区外的标签被裁剪掉
坐标轴
bool attachAxis()
bool detachAxis()
Qlist attachedAxes()
为序列附加-个坐标轴,通常需要一个X轴和一个Y轴
解除一个附加的坐标轴
返回附加的坐标轴的列表
数据点标签的格式设置使用函数setPointLabelsFormat(),有两种数据可以在数据点标签中显示,有固定的标签:
@xPoint 数据点的X值;
@yPoint 数据点的Y值。
例如,使数据点标签只显示Y值,设置语句为:
curSeries->setPointLabelsFormat (''@yPoint");
如果使数据点标签显示(X,Y)值,设置语句为:
curSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
为一个序列添加数据点,可以使用append()函数,也可以使用流操作符“<
series0<
为序列指定坐标轴
chart->setAxisX(axisX, series0);//添加X坐标轴
chart->setAxisX(axisX, ;series1);//添加X坐标轴
chart->setAxisY(axisY, series0);//添加Y坐标轴
chart->setAxisY(axisY, series1);//添加Y坐标轴
QChart:: setAxisX()函数为序列指定X坐标轴,并将坐标轴添加到图表里;QChart::setAxisY() 函数为序列指定Y坐标轴,并将坐标轴添加到图表里。无需再调用序列的attachAxist)函数。若要 使用序列的attachAxis()函数,则实现上述功能的代码如下:
chart->addAxis(axisX,Qt::AlignBottom); //坐标轴添加到图表表,并指定方向
chart->addAxis(axisY,Qt::AlignLeft);
series0->attachAxis (axisX) ;//序列 series0 附加坐标轴
series0->attachAxis(axisY);
seriesl->attachAxis (axisX);//序列 seriesl 附加坐标轴
seriesl->attachAxis(axisY);
即先用QChart::addAxis()函数添加一个坐标轴到图表,并指定坐标轴的方向,然后用序列的 attachAxis()函数附加坐标轴对象。
3、QValueAxis坐标轴的设置
用QValueAxis类的坐标轴,这是数值型坐标轴,与QLineSeries正好配合使用
QValueAxis类的 主要函数见下表
分组
函数 功能描述
坐标轴整体
void setVisible()
Qt::Orientation orientation()
void setMin()
void setMax()
void setRange()
设置坐标轴可见性
返回坐标轴方向
设置坐标轴最小值
设置坐标轴最大值
设置坐标轴最小最大值表示的范围
void setLabelFormat()
void setLabelsAngle()
void setLabelsBrush()
void setLabelsColor()
void setLabe!sFont()
void setLabelsVisible()
void setLabelFormat()
void setLabelsAngle()
void setLabelsBrush()
void setLabelsColor()
void setLabe!sFont()
void setLabelsVisible()
设置标签格式,例如可以设置显示的小数点位数
设置标签的角度,单位为度
设置标签的画刷
设置标签文字颜色
设置标签文字字体
设置轴标签文字是否可见
轴线和刻度线
void setTickCount()
void setLineVisible()
void setLinePen()
void setLinePenColor()
设置坐标轴主刻度的个数
设置轴线和刻度线的可见性、
设置轴线和刻度线的凼笔
设置轴线和刻度线的颜色
主网格线
void setGridUneColor()
void setGridLinePen()
void setGridLineVisible()
设置网格线的颜色
设置网格线的画笔
设置网格线的可见性
次刻度线和次网格线
void setMinorTickCount()
void setMinorGridLineColor()
void setMinorGridLinePen()
void setMinorGridLineVisible()
设置两个主刻度之间的次刻度的个数
设置次网格线的颜色
设置次网格线的画笔
设置次网格线的可见性
QValueAxis坐标轴有以下几个组成部分。
•坐标轴标题:是在坐标轴下方显示的文字,表示坐标轴的名称,图中X轴坐标轴的标题是 "time(secs)"。坐标轴标题除了可以设置文字内容,还可以设置字体、画刷和可见性。
•轴线和刻度线:轴线是图中从左到右的表示坐标轴的直线,刻度线是垂直于轴线的短线, 包括主刻度线和次刻度线,主刻度个数是tickCount(),每两个主刻度之间的次刻度的个数是 minorTickCount()。
•轴标签:在主刻度处显示的数值标签文字,可以控制其数值格式、文字颜色和字体等。
•主网格线:在绘图区与主刻度对应的网格线,可以设置其颜色、线条的pen属性、可见 性等。
•次网格线:在绘图区与次刻度对应的网格线,可以设置其颜色、线条的pen属性、可见 性等。
搞清楚坐标轴的这些组成部分后,对其进行属性读取或设置就只需调用相应的函数即可。
本文转载自:qchart x轴设置宽度_Qt Charts各种设置_Janice Lu的博客-CSDN博客
其它文章 :
QT TextEdit控件_双子座断点的博客-CSDN博客_qt textedit
QT QComboBox使用详解_双子座断点的博客-CSDN博客
QT QtableView操作详解_双子座断点的博客-CSDN博客_qtableview增删改查
Qt QStandardItemModel(1超级详细用法)_双子座断点的博客-CSDN博客_qstandardmodel
Qt QStandardItemModel(2超级详细函数)_双子座断点的博客-CSDN博客_qstandarditemmodel点击事件
QT QRadioButton使用详解_双子座断点的博客-CSDN博客_qt radiobutton
QT QLineEdit使用详解_双子座断点的博客-CSDN博客_qt qlineedit
Qt QMessageBox使用详解_双子座断点的博客-CSDN博客_qt message
QChart折线图、饼状图、条形图、曲线图_双子座断点的博客-CSDN博客_qchart样式
QChart属性详解_双子座断点的博客-CSDN博客_setanimationoptions
QCharts QValueAxis使用_双子座断点的博客-CSDN博客_qvalueaxis
Qt 5 等待提示框(开源 动态图)_双子座断点的博客-CSDN博客_qt 等待对话框
QtDataVisualization 数据3D可视化_双子座断点的博客-CSDN博客_qtdatavisualization
关注查看全文

ui
qt
洗衣机品牌排行榜前十名有哪些
精选推荐
广告

Qt tableview 和qchart的初步使用范例
32下载·1评论
2018年8月22日
QChart折线图、饼状图、条形图、曲线图
886阅读·0评论·1点赞
2021年5月7日
Qt(十三)QChart绘制折线图
5421阅读·4评论·9点赞
2022年4月5日
Qt 中 QChart 由于 addSeries 和attachAxis 顺序问题导致无法显示曲线
312阅读·0评论·1点赞
2022年10月31日
QChart曲线图基本知识
3102阅读·0评论·3点赞
2019年7月16日
QChart数据可视化应用
1506阅读·0评论·3点赞
2021年5月28日
土地房屋安置怎么办?在明律师帮您维权,一对一免费咨询



在明拆迁律师
广告
QChart的简单使用
19W阅读·4评论·18点赞
2020年6月22日
Qt QChart,利用QChart绘制动态曲线
40W阅读·36评论·27点赞
2017年7月11日
Qt开发技术:QCharts(一)QCharts基本介绍以及图表框架详解
51W阅读·1评论·43点赞
2020年6月3日
QChart教程(一):QChart实现动态曲线
26W阅读·1评论·17点赞
2019年8月13日
Qt使用QtCharts画滚动动态曲线
4723阅读·2评论·8点赞
2020年5月6日
QPieSlice QPieSeries饼状图 QBarSet QBarSeries柱状图
2797阅读·0评论·0点赞
2020年3月5日
Animation基础知识
198阅读·0评论·0点赞
2019年6月4日
1[QT | QCharts | 动态显示]折线图标题字体大小无法更改
852阅读·0评论·0点赞
2021年7月19日
QChart的用法
14W阅读·1评论·7点赞
2016年12月7日
QT之QChart使用指南
7306阅读·5评论·19点赞
2021年6月18日
QChart设置setPointLabelsFormat不显示
1844阅读·0评论·1点赞
2021年3月18日
protues 选项卡说明
813阅读·0评论·0点赞
2020年3月18日
QT中图表类QChart系列之(1)-基本用法,画折线图、各个类之间的关系
15W阅读·0评论·6点赞
2018年10月9日
去首页
看看更多热门内容
评论1

小白飘过0411

赞
很详细,感谢
XYDiagramAxisYRangeMinValue
XYDiagramAxisYRangeMaxValue
NumericOptions 可以设置坐标的类型。
//简单的做个
import javaawtGraphics;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingTimer;
public class Circle extends JFrame {
public Circle(){
super();
CirclePanel panel=new CirclePanel();
add(panel, "Center");
setSize(500, 500);
setVisible(true);
}
public static void main(String[] args) {
new Circle();
}
class CirclePanel extends JPanel{
public static final double PI=MathPI;
private int degree=0;
private int axisx;
private int axisy;
public CirclePanel(){
setSize(500, 500);
axisx=getWidth()/2;
axisy=getHeight()/2;
setVisible(true);
Timer timer=new Timer(10,new TimerListener());
timerstart();
}
@Override
protected void paintComponent(Graphics g) {
superpaintComponent(g);
gfillRect(axisx, axisy, 2, 2);
gdrawOval((int)(axisx-100+5), (int)(axisy-100+5), 200, 200);
gfillOval(-(int)(100Mathsin(PIdegree/180))+axisx,
(int)(100Mathcos(PIdegree/180))+axisy, 10, 10);
}
class TimerListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
degree += 1;
repaint();
}
}
}
}
将Y轴设置为以2为底的对数轴,代码如下:
using System;using SystemWindowsForms;
using SystemIO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 将Y设置为以2为底的对数
chart1ChartAreas[0]AxisYIsLogarithmic = true;
chart1ChartAreas[0]AxisYLogarithmBase = 2;
}
}
}
欢迎分享,转载请注明来源:品搜搜测评网