怎样用TeeChart画3D瀑布图相关信息瀑布

ggplot2绘制瀑布图
1 绘图函数
1.1 参数说明
数据类型:data.frame
column:value,数值数据,留存、增加用正数,减少用负数。
column:group,从’start’, ‘up’, ‘down’, ‘end’中取值,用于标注数值的类型。
数据类型:字符串
起始柱的颜色
数据类型:字符串
上升柱的颜色
数据类型:字符串
下降柱的颜色
数据类型:字符串
结束柱的颜色
数据类型:数值
数据类型:字符串向量
数据类型: logical
是否在柱之间添加连线
1.2 函数代码
library(ggplot2)
water.full &-
function(raw.data, col.s = 'purple', col.u = 'orange', col.d = 'darkblue',
col.e = 'purple', width = 35, xlabs = NA, addline = TRUE){
num &- nrow(raw.data)
end.val &- raw.data[which(raw.data$group == 'end'),'value']
end &- c(cumsum(raw.data$value[-num]), end.val)
start &- end - raw.data$value
cols &- data.frame(
group = c('start', 'up', 'down', 'end'),
colour.names = c(col.s, col.u, col.d, col.e),
stringsAsFactors = F
temp &- data.frame(
id = 1:num,
group = raw.data$group,
value = raw.data$value,
start = start,
end = end, stringsAsFactors = F
data.clean &- merge(temp, cols, by.x = 'group', by.y = 'group')
data.clean$group &- as.character(data.clean$group)
data.clean &- data.clean[order(data.clean$id),]
thetheme &- theme_light() + theme(
title = element_text(size = 20, colour = 'black'),
legend.text = element_text(size = 10),
legend.title = element_text(size = 12),
axis.text.x = element_text(size = 11, angle = 0),
axis.text.y = element_text(size = 12),
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12),
panel.background = element_rect(fill = 'white'),
panel.grid.major.x = element_line(size = .2),
panel.grid.minor.x = element_line(size = .2, linetype = 'dashed'),
panel.grid.major.y = element_line(size = .2),
panel.grid.minor.y = element_line(size = .2, linetype = 'dashed'),
panel.border = element_blank(),
legend.position = 'none'
g &- ggplot(data.clean) +
geom_segment(
aes(x = id, y = start, xend = id, yend = end, col = group),
size = width) +
geom_text(
aes(x = id, y = 0.5*(start + end), label = value),
col = 'white') +
geom_hline(yintercept = 0, size = 1) +
thetheme +
scale_color_manual(
values = c('start' = col.s, 'end' = col.e, 'up' = col.u,'down' = col.d)) +
scale_y_continuous('')
if (addline) {
lstart &- data.clean$start[-1]
lend &- data.clean$end[-num]
lstart[num - 1] &- lend[num - 1]
df.line &- data.frame(
lx.start = data.clean$id[-num],
lx.end = data.clean$id[-1],
ly = lstart
geom_segment(
data = df.line,
aes(x = lx.start, y = ly, xend = lx.end, yend = ly),
linetype = 'dashed', size = 1
if (length(xlabs) == 1) {
scale_x_continuous('',
breaks = data.clean$id,labels = data.clean$group, expand = c(0.1, 0.1)
scale_x_continuous('',
breaks = data.clean$id,labels = xlabs, expand = c(0.1, 0.1)
raw.data &- data.frame(
group = c('start', 'down','up', 'up','end'),
value = c(200, -100, 100,200, 400)
water.full(
col.s = 'purple', col.u = 'orange', col.d = 'darkblue', col.e = 'purple',
xlabs = c('2017Q1', '减少', '新增', '新增','2018Q1'),
width = 35, addline = T
没有更多推荐了,TeeChart For VCL/FMX V2017使用教程:第十三章 在图板上自定义画图
通过TCanvas3D组件,TeeChart提供了广泛的定制自定义绘图工具。使用Canvas(画布),你可以在图表面板的任何地方添加形状、线条和文字,并定义它们的颜色、笔和画笔样式。目录 13.1 TeeChart画布
画布画笔和刷子
添加2D形状
添加3D形状
13.2 高级自定义画图
(1)组件概述 13.1 TeeChart画布13.1.1 绘制顺序当使用TeeChart画布方法时,记住绘制顺序是很重要的。在图表上画一条线,然后添加一序列的数据点将会导致线被超画。要使线出现在图表网格上面和序列下面,您可以将线放置到序列的BeforeDrawValues事件中。您可以在OnAfterDraw事件中放置行代码,以便让线出现在这个序列的上方。事件顺序,4个原则图表绘制事件OnBeforeDrawChart eventOnBeforeDrawAxes eventOnBeforeDrawSeries eventOnAfterDraw event13.1.2 画线1) 2D图表
让我们添加一个画布:
示例//从左上方到右下方画一条对角线
//在2D图表的图表区域里
With Chart1, ChartRect do
//将指针移到左上角的图表点
Canvas.MoveTo(Left,Top);
Canvas.LineTo(Right,Bottom);
2) 3D正交图表
在一个正交的3D图表中,由于三维正交位移,轴的位置会被偏移。因此我们相应地要移动这条线:示例//从左上方到右下方画一条对角线
//在3D图表的图表区域里
With Chart1, ChartRect do
//将指针移到左上角的图表点
Canvas.MoveTo(Left + Width3D,Top - Height3D);
//画线 +调整3D位移
Canvas.LineTo(Right + Width3D,Bottom - Height3D);
3) 3DNativemode 或OpenGL 图表
在Native 3D图表或OpenGL图表上绘制相同的线(这也适用于2D和3D的正交图表):
//从左上方到右下方画一条对角线
//在3D Nativemode或OpenGL图表的图表区域With Chart1,Canvas do
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD //Pen必须是1到使用Pen.Style
Brush.Style := bsC //透明
//然后画线
MoveTo3D(ChartRect.Left,ChartRect.Top,0);
LineTo3D(ChartRect.Right,ChartRect.Bottom,Width3D);
MoveTo3D和LineTo3D方法识别出了对ChartRect的位移,这是由于“Full”3D的Elevation(海拔)和Rotation(旋转)所造成的。13.1.3 画布的画笔和刷子
上面的线是用已定义的笔和笔刷绘制的,这是在绘制线条之前定义的最后一个绘制对象。若可能不是你想要的那支笔。你可以相应地换笔:示例//在绘制线条之前,先定义笔和画笔
With Chart1,Canvas,ChartRect do
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD //Pen必须是1来使用Pen.Style
Brush.Style := bsC //透明
//然后画线
MoveTo(Left + Width3D,Top - Height3D);
LineTo(Right + Width3D,Bottom - Height3D);
13.1.4 添加2D形状
以类似的方式添加2D画布的形状。下面的例子在图表区域的中心添加了一个矩形:1) 2D图表
3D 正交图表仅支持2D形状.示例With Chart1, Canvas do
/准备笔和刷
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD
Brush.Color := clW
Brush.Style := bsS
//你可以在任何图表上绘制一个矩形(2D或3D)
Rectangle(100,100,200,200);
在3D图表上,你也可以在Z平面上移动矩形。参看RectangleWithZ方法。这个例子是一个正交或Nativemode/OpenGL的图表,将矩形放在左边的墙上,但是将它移动到图表的后半部分(朝向后墙)。With Chart1,Canvas,ChartRect do
//准备好笔和刷
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD
Brush.Color := clW
Brush.Style := bsS
//用Z位移矩形绘制矩形
RectangleWithZ(Rect(Left,
Left+((Right-Left) div 2),
Top+((Bottom-top) div 2)),
Width3D div 2);
13.1.5 添加3D形状
你可以将3D形状添加到3D图表中。这个例子在图表矩形的左上象限绘制了一个立方体。这个深度覆盖了从墙前面到墙后面的区域。参看Cube的方法。With Chart1,Canvas,ChartRect do
//准备好笔和刷
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD
Brush.Color := clW
Brush.Style := bsS
Cube(Left,
Left+((Right-Left) div 2),
Top, Top+((Bottom-Top) div 2), 0, Width3D, True);
13.4.6 添加文字
1) 2DText location
将文本添加到一个矩形中:
示例procedure TForm1.Button1Click(Sender: TObject);
var rectLeft,rectTop,rectRight,rectBottom:I
With Chart1, Canvas, ChartRect do
rectLeft:= L
rectTop:= T
rectRight:= Left + (Right - Left) div 2;
rectBottom:= Top + (Bottom - Top) div 2;
//准备好笔和刷
Pen.Color := clB
Pen.Width := 1;
Pen.Style := psD
Brush.Color := clW
Brush.Style := bsS
Rectangle(rectLeft,rectTop,rectRight,rectBottom);
//修改字体
Font.Color := clR
//在矩形的中点开始添加文本
TextOut(rectLeft + (rectRight - rectLeft) div 2, rectTop + (rectBottom-rectTop) div 2, 'Hello');
2) 3D 文本定位
您可以使用TextOut3D方法在不同的3D平面中放置文本。
示例With Chart1, Canvas, ChartRect do
Brush.Style := bsC
TextOut3D(Left, Top, Width3D div 2, 'Hello');
13.1.7 应用示例
这个例子取一个序列的第三和第十个值,在它们之间绘制一条线,告诉我们新线的第一个和最后一个点的值,以及它们之间的区别:示例首先将一些数据添加到空的图表中
procedure TForm1.BitBtn1Click(Sender: TObject);
Series1.FillSampleValues(20);
//你可以把这段代码放到OnAfterDraw事件中
procedure TForm1.Chart1AfterDraw(Sender: TObject);
With Chart1 do
If SeriesCount & 0 Then
If Series1.Count & 10 Then
//添加一些形状
Canvas.Pen.Color := clB
Canvas.Pen.Width := 1;
Canvas.Pen.Style := psD
Canvas.Brush.Style := bsC
Canvas.MoveTo (Axes.Bottom.CalcXPosValue(Series1.XValues[3]),
Axes.Left.CalcYPosValue(Series1.YValues[3]));
Canvas.LineTo (Axes.Bottom.CalcXPosValue(Series1.XValues[10]),
Axes.Left.CalcYPosValue(Series1.YValues[10]));
Canvas.Brush.Style := bsS
Canvas.TextOut(Axes.Bottom.CalcXPosValue(Series1.XValues[3]),
Axes.Left.CalcYPosValue(Series1.YValues[3]), 'Point value: ' +
FloatToStr(Series1.YValues[3]));
Canvas.TextOut(Axes.Bottom.CalcXPosValue(Series1.XValues[10]),
Axes.Left.CalcYPosValue(Series1.YValues[10]), 'Point value: ' +
FloatToStr(Series1.YValues[10]));
Canvas.TextOut(Axes.Bottom.CalcXPosValue(Series1.XValues[10]),
Axes.Left.CalcYPosValue(Series1.YValues[10]) +
Canvas.TextHeight('Any letter'), 'Change is: ' +
FloatToStr(Series1.YValues[10] - Series1.YValues[3]));
13.2 高级自定义绘图13.2.1 组件概述
几乎所有的TeeChart单元现在都使用了TeCanvas单元。这个单元是一个低级单元,它提供了封装在新的TCanvas3D组件中的所有绘图函数。
如果您使用TeeChart 的Canvas属性进行特殊的自定义绘制,那么您应该将该单元添加到您的窗体“Uses”子句中。使用它是安全的,因为它除了正常的Delphi单元之外没有其他依赖项。1) TCanvas3D类:
这个由Canvas派生的类包含了对3D旋转、缩放、滚动和3D基本体的支持。它的所有方法都是虚拟的和抽象的,所以这意味着你不能直接使用它。您应该使用一个继承类来实现所有的方法和属性。
使用此Canvas,图表组件现在可以支持“插件”画布。也就是说,您可以在设计时或运行时更改“Chart1.Canvas”属性,所有的绘画都将被重定向到新的画布:
Chart1.Canvas := TGLCanvas.C
//&--开关显示为OpenGL
TeeChart包括这些新的虚拟画布:TTeeCanvas3D TGLCanvas (为OpenGL渲染)实现一个新的虚拟Canvas,虽然不是简单的,但应该很容易做到。例如,您甚至可以创建一个TVRMLCanvas,它将生成一个包含VRML(虚拟现实)图形指令的ascii文件。(或者另一个保存到DXF、3DS、等等)。这些画布应用于基本的TCustomChart类,因此它们适用于TChart、TDBChart、TQRChart或任何其他派生的图表类。注意:OpenGL DLL只用于32位Windows,因此也就是GLCanvas。2) TTeeCanvas3D类:这是内部使用的虚拟TCanvas3D类的实现。它是一个标准的Delphi TCanvas类的包装器。它有许多直接调用Windows GDI来加速绘图。它增加了Tcanvas3D特性,如旋转、缩放等。它适用于所有的Delphi和C++Builder版本。3) TGLCanvas 类:这个类驻留在一个单独的单元/包中,以使应用程序独立于OpenGL的dll。它只适用于32位Delphi(和C++Builder)。当使用TGLCanvas来绘制图表时,应包括“Uses TeeGLEditor”,图表编辑器将在运行时添加另一个页面来改变GL的特征,如光线的位置和颜色。对于OpenGL在设计时可用,在窗体中添加TTeeOpenGL组件,将它与图表关联起来,并设置Active:=True。有一个新的非可视组件(TTeeOpenGL),它允许您在设计或运行时“connect(连接)”一个现有的图表,并立即看到使用OpenGL 3D库渲染的图表。这个组件允许你定义OpenGL的特定属性,比如灯光属性。TTeeCanvas3D和TGLCanvas的比较: OpenGL画布支持照明(光线、光线颜色、位置等),而TeeCanvas则用深色的颜色来模拟光线画3D面。 OpenGL画布不支持元文件的创建,因此为了打印一个大而胖的Tbitmap,它应该被创建并发送到打印机画布,这意味着它只能工作于具有良好内存和正常驱动的打印机。元文件不能被创建,复制到剪贴板,保存或打印。OpenGL画布需要OpenGL dll(在Windows NT及以后中可用,可以从www.sgi.com访问其他替代库。取决你的CPU和视频硬件,来自于Silicon Graphics(硅谷图形公司)的OpenGL Dlls可能比来自微软的更快)。 OpenGL画布支持不同的字体尺寸和颜色,但是它不支持多种字体样式。字体的所有字符都被转换成绘图指令。这占用了大量的内存和CPU速度。 第十三章 完
没有更多推荐了,Origin9.1绘制三维(3D)叠加瀑布图的方法_Office办公助手
分享高质量的原创Office教程、Word教程、Excel教程、PPT教程。
当前位置: >
Origin9.1绘制三维(3D)叠加瀑布图的方法
发布时间:  来源:Office办公助手
有时为了方便对比,尤其是多曲线对比,二维图又无法满足要求,那么可以考虑使用下图所示的三维叠加图。今天本文就如何使用Origin 9.1绘制下图进行简要说明。
1、对于上图可采用Origin 9.1中XYY轴3D waterfall图进行绘制。
本例中X轴的两个峰原本属于两个不同的类别,但绘制时我们将其组合在了一起。其中&1#峰&的数据在15-30行,而&2#峰&的数据在33行之后。列B、C、D各为一套含两个峰的数据。
2、选中全部数据,进入Plot下的3D XYY菜单,点击3D waterfall Z : Color Mapping。
3、完成上述操作后,Origin 9.1默认生成的图形如下。
4、双击曲线,弹出Plot Details菜单,进入右侧的Group选项卡。将Border Color和Area Fill Color的Increment设置为By One。点击Details后面的按钮弹出Increment Editor对话框,设置各曲线的颜色和填充色。
5、完成填充色设置后的效果图如下。
6、上图中的视角有些长,现在将其调短点。首先点击3D Rotation中的Tilt Up按钮将视角收短。
7、然后点击3D Rotation中的Decrease perspective工具将视角调正。
8、接下来双击曲线,弹出Plot Details菜单,进入右侧的Planes选项卡。将XY、YZ、ZX三个平面的背景色取消掉。
9、取消三个平面背景颜色后的效果图如下。
由于X轴上的两个峰分属于不同的类别,因此需要调整X轴的刻度线和标签。
10、双击X轴的刻度,弹出Axis Dialog对话框,左侧选择X Axis下的Scale。由于只有两个类别,因此打算用3个主刻度,起点、终点和中间点各一个。因此,将Major Ticks的Type设置为By Count,并将Count设置为3。由于第一个主刻度设置在坐标值的起点,因此将First Tick设置成与From一致。
11、完成后的效果图如下,X轴的刻度线是不是变过来了呢?
12、至于类别名称,可以用自定义标签来做。
也可通过工具栏中的Text Tool直接输入,并拖动到合适的位置即可。原有的坐标刻度值可以直接用鼠标选中,按Delete键删除即可。
更多相关阅读
上一篇: 下一篇:
本文介绍使用Origin 9.1将扫描图电子化转成Origin文件的方法。
本文讲述了使用Origin 9.1绘制带XY误差线的散点半圆极坐标图的方法。
运用Origin软件对三个典型的物理化学实验进行数据处理和绘图,介绍了
本文提供了Origin 9.1 专业版软件下载,并图文详细讲述了Origin 9.1 的安装
Origin绘图教程
热门Origin教程
专题教程推荐
(window.slotbydup=window.slotbydup || []).push({
id: '3577897',
container: s,
size: '300,450',
display: 'inlay-fix'
热门资源下载}

我要回帖

更多关于 基于瀑布模型的信息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信