开源不易,感谢支持
如需定制,请联系:Lvwl@outlook.com
FCSVisualChart 流式细胞术图表控件 Gitee、NuGet
<b>数据量500万,单图1秒以内完成显示。(电脑配置不同,性能有所差异)</b>
支持.NET6、.NET5、.NETCore3.1、.NETFramework 4.6.2及以上的WPF
支持Line、Log、Duration数据轴
支持散点图、直方图、密度图、伪彩图、等高线图、折线图
支持段选门、椭圆门、多边形门、四边形门、横线门、竖线门、四象限门、自动多边形门、自动段选门
支持多数据源
支持鼠标滚轮放大缩小,鼠标左键平移操作
支持直方图多数据源错位显示
支持门内数据突出显示及多图联动突出显示
Chart
属性 |
含义 |
类型 |
说明 |
MoveType |
移动方式 |
ChangeType |
鼠标左键控制图表移动方式 |
ZoomType |
缩放方式 |
ChangeType |
鼠标滚轮控制图表缩放方式 |
DataSource |
数据源 |
ObservableCollection< ChartDataSource > |
|
XAxis |
x轴 |
IAxis |
|
YAxis |
y轴 |
IAxis |
|
Series |
显示的图 |
ISeries |
|
AxisWidth |
Y轴宽度 |
double |
|
AxisHeight |
X轴高度 |
double |
|
Gates |
门的集合 |
ObservableCollection< BaseGate > |
|
CanChangeGate |
是否可以更改门 |
bool |
|
GateChangedCommand |
门发生变化触发命令 |
ICommand |
只写,CommandParameter是门对象 |
GateGotFocusCommand |
门得到焦点触发命令 |
ICommand |
只写,CommandParameter是门对象 |
GateLostFocusCommand |
门失去焦点触发命令 |
ICommand |
只写,CommandParameter是门对象 |
CreateNewAreaNameFunction |
门划分的区域的命名方式 |
Func< BaseGate, string > |
|
ExistedGateAreaNames |
已存在的门划分的区域的名称集合 |
Dictionary< string, int > |
默认门划分区域命名方式使用 |
GainMinValue |
增益最小值 |
double |
|
GainMaxValue |
增益最大值 |
double |
|
GainXValue |
x轴增益值 |
double |
|
GainYValue |
y轴增益值 |
double |
|
GainXCanChange |
x轴的增益是否可编辑 |
bool |
|
GainYCanChange |
y轴的增益是否可编辑 |
bool |
|
GainXValueChangedCommand |
x轴增益更改完成命令 |
ICommand |
只写 |
GainYValueChangedCommand |
y轴增益更改完成命令 |
ICommand |
只写 |
GainStrokeThickness |
增益图标边框粗细 |
double |
|
GainStroke |
增益图标边框色 |
Brush |
|
GainFill |
增益图标填充色 |
Brush |
|
ThresholdVisibility |
是否显示阈值控制线 |
Visibility |
|
ThresholdMinValue |
阈值最小值 |
double |
|
ThresholdMaxValue |
阈值最大值 |
double |
|
ThresholdValue |
阈值 |
double |
|
ThresholdValueChangedCommand |
阈值变化命令 |
ICommand |
只写 |
ThresholdStrokeThickness |
阈值控制线条宽度 |
Thickness |
|
ThresholdFill |
阈值控制线填充色 |
Brush |
|
ThresholdStroke |
阈值控制线边框色 |
Brush |
|
ThresholdGeometry |
阈值控制线条矢量数据 |
Geometry |
只读 |
ThresholdCenterPointSize |
阈值控制线中心点的大小 |
byte |
|
GateAreaShowType |
门划分区域内数据突出显示方式 |
GateAreaShowType |
尽量不要启用该功能,尤其是采集过程中,严重影响速度 |
ChangeType 枚举
属性 |
含义 |
说明 |
None |
不变更 |
|
X |
沿X轴变更 |
|
Y |
沿Y轴变更 |
|
XY |
沿XY轴变更 |
|
GateAreaShowType 枚举
属性 |
含义 |
说明 |
None |
不突出显示 |
|
Mine |
突出显示自己的门划分区域内数据 |
|
All |
突出显示所有 |
|
ChartDataSource
属性 |
含义 |
类型 |
说明 |
XSource |
x轴数据源 |
IList |
|
YSource |
y轴数据源 |
IList |
|
Indexs |
有效数据索引 |
IList< int > |
门划分的区域会形成新的数据源 |
AreaIndexs |
门划分的区域集合 |
ObservableDictionary< GateArea, IList< int > > |
区域对应的索引集合,ObservableDictionary实现了INotifyCollectionChanged、INotifyPropertyChanged接口 |
XSourceConverter |
x值转换方法 |
Func< object, double > |
数据源中的值转换成double值方法 |
YSourceConverter |
y值转换方法 |
Func< object, double > |
数据源中的值转换成double值方法 |
DisplayColor |
显示的颜色 |
Color |
直方图、散点图、密度图以此颜色显示 |
IsDrawing |
是否正在绘制图形 |
bool |
只读 |
CancelDrawing() |
停止绘制图形 |
void |
|
Axis
IAxis 轴抽象基类
属性 |
含义 |
类型 |
说明 |
OwnerChart |
所属的Chart控件 |
Chart |
只读 |
AxisType |
轴类型 |
AxisType |
轴控件赋值给Chart控件后,Chart控件为其赋值 |
Foreground |
显示的前景色 |
Brush |
|
FontSize |
显示的数字大小 |
double |
|
PowerFontSize |
显示的指数数字大小 |
double |
|
Max |
坐标最大值 |
double |
|
Min |
坐标最小值 |
double |
|
SetMaxMin(double,double) |
重置最大最小值 |
void |
Max和Min是只读,只能通过此方法修改 |
GetValueAxisConvertParam() |
实际值和坐标值转换时使用的参数 |
ValueAxisConvertParamBase |
|
ValueToAxisValue(double)、ValueToAxisValue(double,ValueAxisConvertParamBase) |
实际值转坐标值方法 |
double |
|
AxisValueToValue(double)、AxisValueToValue(double,ValueAxisConvertParamBase) |
坐标值转实际值方法 |
double |
|
GetConvertParam() |
获取实际值、坐标值、位置值转换参数 |
ValueLocationConvertParam |
|
GetValueLocation(double)、GetValueLocation(double,ValueLocationConvertParam) |
实际值转位置值 |
double |
|
GetAxisValueLocation(double)、GetAxisValueLocation(double,ValueLocationConvertParam) |
坐标值转位置值 |
double |
|
GetLocationAxisValue(double)、GetLocationAxisValue(double,ValueLocationConvertParam) |
位置值转坐标值 |
double |
|
GetLocationValue(double)、GetLocationValue(double,ValueLocationConvertParam) |
位置值转实际值 |
double |
|
Draw() |
重新绘制轴 |
void |
|
RedrawAll() |
重新绘制所有,包括轴、图、门 |
void |
轴的关键参数发生变化影响图表显示时使用 |
AxisType 枚举,轴类型
ValueLocationConvertParam 轴转换参数,实际值、坐标值、位置值相互转换时使用
属性 |
含义 |
类型 |
说明 |
MaxAxisValue |
最大坐标值 |
double |
|
MinAxisValue |
最小坐标值 |
double |
|
Length |
图长度 |
double |
X轴取控件的宽度,Y轴取控件的长度 |
AxisType |
轴类型 |
AxisType |
|
ValueAxisParam |
实际值和坐标值转换参数 |
ValueAxisConvertParamBase |
|
LinearAxis 线性轴,继承自IAxis
属性 |
含义 |
类型 |
说明 |
Power |
10的次方数 |
int |
只读 |
DurationAxis 时间段轴,单位为秒,继承自IAxis
NegativeLogAxis 可负数指数轴,继承自IAxis
属性 |
含义 |
类型 |
说明 |
LogBase |
log的底 |
double |
正整数或常数e、π |
LinePowerCount |
线性显示的次方数,0附近 |
uint |
-Math.Pow(LogBase,LinePowerCount)~Math.Pow(LogBase,LinePowerCount)之间用线性显示 |
LineCompress |
线性部分压缩倍数 |
double |
非0正数,默认1 |
NegativeLogValueAxisConvertParam 实际值和坐标值转换参数
属性 |
含义 |
类型 |
说明 |
LogBase |
log的底 |
double |
|
LinePowerCount |
线性显示的次方数,0附近 |
uint |
|
LineCompress |
线性部分压缩倍数 |
double |
|
Series 显示的图
ISeries 图的抽象基类
属性 |
含义 |
类型 |
说明 |
OwnerChart |
所属chart控件 |
Chart |
只读 |
ShowFill |
是否显示填充 |
bool |
默认true |
ShowStroke |
是否显示边框 |
bool |
默认true |
StrokeThickness |
边框粗细 |
int |
默认1 |
FillColorA |
填充色不透明度 |
byte |
默认0xff |
StrokeColorA |
边框不透明度 |
byte |
默认0xff |
ExcessDisplayAtEdge |
超出边界是否压边显示 |
bool |
默认true |
MaxDegreeOfParallelism |
计算图形时使用的线程数 |
int |
默认4 |
GetModel() |
获取图的模型 |
BaseSeriesModel |
可用于序列化反序列化存储的数据模型 |
CreateByModel(BaseSeriesModel) |
从模型创建一个新的图 |
ISeries |
|
Redraw() |
重新刷新图形 |
void |
可以手动刷新一次图形显示 |
HistogramXStatisticsSeries X轴统计直方图,继承自ISeries
属性 |
含义 |
类型 |
说明 |
Count |
直方图等份数 |
int |
默认256 |
Smooth |
是否平滑 |
bool |
默认false |
SmoothPointCount |
简单平滑算法点数 |
int |
默认2 |
OffsetX |
x轴方向偏移量 |
ushort |
多数据源显示时,对每个数据源显示的图形进行偏移 |
OffsetY |
y轴方向偏移量 |
ushort |
门的绘制只在最前方的数据源坐标系上绘制 |
XYSeries 二维图的抽象基类
属性 |
含义 |
类型 |
说明 |
PointLength |
点宽度 |
int |
默认2 |
DensitySeries 密度图,继承自XYSeries
属性 |
含义 |
类型 |
说明 |
MinOpacity |
最小不透明度 |
byte |
默认0x10 |
PseudoColorSeries 伪彩图,继承自XYSeries
ScatterSeries 散点图,继承自XYSeries
LineSeries 折线图,继承自XYSeries
属性 |
含义 |
类型 |
说明 |
ShowPoint |
显示折点 |
bool |
默认true |
ContourSeries 等高线图,继承自XYSeries
属性 |
含义 |
类型 |
说明 |
GradeBase |
等高线分级基数 |
int |
默认3 |
GradeType |
分级方式 |
GradeType |
默认GradeType.Log |
GradeType 枚举,分级方式
属性 |
含义 |
说明 |
Line |
线性分级 |
|
Log |
对数分级 |
|
Gate 门
GateArea 门划分的区域
属性 |
含义 |
类型 |
说明 |
Name |
区域名称 |
string |
|
DisplayColor |
显示的颜色 |
Color |
|
OwnerGate |
所属的门 |
BaseGate |
只读 |
BaseGate 门的抽象基类
属性 |
含义 |
类型 |
说明 |
Fill |
门的填充颜色 |
Brush |
默认Brushes.Transparent |
Stroke |
门的线条颜色 |
Brush |
默认Brushes.Black |
StrokeThickness |
门的线条粗细 |
double |
默认1 |
AreaNameFontSize |
区域名称文字大小 |
double |
默认14 |
AreaNameTypeface |
区域名称文字字体 |
Typeface |
默认Segoe UI |
ShortName |
门划分区域名称前缀 |
string |
只读 |
AreaCount |
门划分的区域数量 |
int |
只读 |
OwnerChart |
所属Chart控件 |
Chart |
只读 |
Areas |
门划分的区域集合 |
GateArea[] |
只读 |
IsCreating |
是否创建中 |
bool |
只读 |
Dispose() |
删除门 |
void |
|
DataInArea(double,double,AreaIndexFuncParam) |
数据在门划分的哪个区域内 |
GateArea |
返回null表示不在任何区域 |
GetAreaIndexsFuncParam() |
获取判断点在门划分哪个区域的方法的参数 |
AreaIndexsFuncParam |
|
GetModel() |
获取门的模型 |
BaseGateModel |
|
IsRefreshing |
是否正在统计门内数据 |
bool |
只读 |
CancelRefreshing() |
取消统计门内数据 |
void |
|
BaseGateModel 门的数据模型抽象基类
属性 |
含义 |
类型 |
说明 |
AreaNames |
区域名称集合 |
string[] |
|
AreaColors |
区域显示颜色集合 |
string[] |
FFFFFFFF:ARGB格式 |
EllipseGate 椭圆门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
Center |
椭圆的中心点 |
Point |
实际值,只读 |
HalfWidth |
椭圆宽度 |
double |
坐标值,只读 |
HalfHeight |
椭圆高度 |
double |
坐标值,只读 |
Angle |
旋转角度 |
double |
只读 |
Radian |
旋转弧度 |
double |
只读 |
EllipseGateModel 椭圆门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
Center |
椭圆中心点 |
Point |
|
HalfWidth |
|
double |
|
HalfHeight |
|
double |
|
Angle |
|
double |
|
LineHorizontalGate 横线门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
Y |
横线Y实际值 |
double |
只读 |
LineHorizontalGateModel 横线门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
Y |
横线Y实际值 |
double |
|
LineVerticalGate 竖线门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
X |
竖线X实际值 |
double |
只读 |
LineVerticalGateModel 竖线门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
X |
竖线X实际值 |
double |
|
PolygonGate 多边形门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
Points |
多边形点位实际值 |
List< Point > |
只读 |
PolygonGateModel 多边形门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
Points |
多边形点位实际值 |
List< Point > |
|
AutoPolygonGate 自动多边形门,继承自PolygonGate,仅用于二维图(散点图、等高线图、密度图、伪彩图)
| 属性 | 含义 | 类型 | 说明 |
| Precision | 自动圈门的精确度 | int | 值越小,精度越高,圈出的多边形的边越多,最小为1,默认5 |
RectangleGate 四边形门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
X1 |
四边形左上角X实际值 |
double |
只读 |
X2 |
四边形右下角X实际值 |
double |
只读 |
Y1 |
四边形左上角Y实际值 |
double |
只读 |
Y2 |
四边形右下角Y实际值 |
double |
只读 |
RectangleGateModel 四边形门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
X1 |
四边形左上角X实际值 |
double |
|
X2 |
四边形右下角X实际值 |
double |
|
Y1 |
四边形左上角Y实际值 |
double |
|
Y2 |
四边形右下角Y实际值 |
double |
|
QuadrantGate 四象限门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
Center |
四象限门中线点实际值 |
Point |
只读 |
Angle1 |
左边线条顺时针旋转角度,-x方向角度为0 |
double |
只读 |
Angle2 |
上边线条顺时针旋转角度,y方向角度为0 |
double |
只读 |
Angle3 |
右边线条顺时针旋转角度,x方向角度为0 |
double |
只读 |
Angle4 |
下边线条顺时针旋转角度,-y方向角度为0 |
double |
只读 |
QuadrantGateModel 四象限门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
Center |
四象限门中线点实际值 |
Point |
|
Angle1 |
左边线条顺时针旋转角度,-x方向角度为0 |
double |
|
Angle2 |
上边线条顺时针旋转角度,y方向角度为0 |
double |
|
Angle3 |
右边线条顺时针旋转角度,x方向角度为0 |
double |
|
Angle4 |
下边线条顺时针旋转角度,-y方向角度为0 |
double |
|
SegmentXGate X轴段选门,继承自BaseGate
属性 |
含义 |
类型 |
说明 |
X1 |
段选门x实际值1 |
double |
只读 |
X2 |
段选门x实际值2 |
double |
只读 |
Y |
段选门在图上Y轴显示的位置值 |
double |
只读 |
SegmentXGateModel X轴段选门模型,继承自BaseGateModel
属性 |
含义 |
类型 |
说明 |
X1 |
段选门x实际值1 |
double |
|
X2 |
段选门x实际值2 |
double |
|
Y |
段选门在图上Y轴显示的位置值 |
double |
|
AutoSegmentXGate X轴自动段选门,继承自SegmentXGate,仅用于直方图
| 属性 | 含义 | 类型 | 说明 |
| Precision | 自动圈门的精确度 | int | 值越小,精度越高,越容易圈出小峰,最小为1,默认6 |
示例
前端
<chart:Chart x:Name="chart">
<chart:Chart.Series>
<chart:ScatterSeries/>
</chart:Chart.Series>
<chart:Chart.XAxis>
<chart:NegativeLogAxis/>
</chart:Chart.XAxis>
<chart:Chart.YAxis>
<chart:NegativeLogAxis/>
</chart:Chart.YAxis>
</chart:Chart>
后端
使用到FCS库
var fcs = FCS.Factory.ReadFileOneDataset(@"D:\Sample_003.fcs");
ChartDataSource data1 = new ChartDataSource() { XSource = fcs.Measurements[0].ChannelValues, YSource = fcs.Measurements[3].ChannelValues };
ChartDataSource data2 = new ChartDataSource() { XSource = fcs.Measurements[12].ChannelValues, YSource = fcs.Measurements[15].ChannelValues };
chart.DataSource = new System.Collections.ObjectModel.ObservableCollection<ChartDataSource>() { data1, data2 };
更新说明
1.5.0
1、添加时间段轴
2、添加折线图
1.4.4
1、修复门内数据突出显示方式切换bug
1.4.2
1、轴基类添加RedrawAll方法,自定义轴成为可能
1.4.1
1、添加自动多边形门和自动段选门
2、可负数对数轴添加线性部分压缩率属性
3、添加门划分区域内的数据突出显示方式
4、修复一些bug
1.3.3
1、修复门移动到空区域后不刷新bug
2、优化四象限门的门内数据判断逻辑
3、优化等高线图的显示效果
1.3.2
1、添加门的ContextMenu属性,实现在门上右击菜单
2、调整代码结构,准备实现散点图的自动多边形门和直方图的自动段选门
3、添加stirng和Color互转的Converter
4、删除ChartDataSource类的DisplayIndex属性
5、ISeries设置Redraw方法的可访问性为public
1.3.1
1、修复一些bug
2、阈值在鼠标移动状态下显示数字,否则不显示数字
3、轴类型改为可写,不再是只读,在脱离Chart控件下可以独立使用
1.3.0
1、添加取消线程方法,图绘制和门内数据统计线程都可取消
2、门模型添加区域显示颜色
3、修复一些bug
1.2.1
1、添加门内数据以不同颜色显示功能,该功能尽量不启用,影响速度,尤其是采样过程中
2、修复一些bug
1.1.5
1、修复一些bug
1.1.4
1、优化可负数指数轴,指数文字可阶段显示
1.1.3
1、修复Y轴增益无法调整bug
1.1.2
1、ChartDataSource类的DisplayColor属性的A值(不透明度)影响图的显示最大不透明度
1.1.1
1、添加门发生变化命令、门获取焦点命令和门失去焦点命令
1.1.0
1、添加阈值和增益控制,数据采集过程中可使用