我正在使用动态数据显示WPF图表.我要求在图表上绘制的曲线上的每个点旁边显示一个标签.
确切的功能如下:
每条曲线都有一个保存其数据的对象和一个包含颜色,标记形状等的描述.它还告诉我标签是否必须对该特定曲线可见.
还有一个选项可以使用复选框隐藏/显示图表上所有曲线上所有点的标签.
还有第三种选择,用户可以左键单击标记并在其旁边看到标签.
现在,我之前通过为每个点添加标签和ElementMarkerPointGraph以及设置标签的可见性来实现它.我知道这种方法可以带来巨大的性能损失.
我现在正在寻找创建一个解决方案,我可以将文本直接渲染到我提供的位置的画布上.我还需要帮助从画布中删除文本.
有没有办法在画布上原生添加文本?最有效的方法是什么?
编辑:我需要在绘图仪放大时移动文本.我已经知道当绘图仪缩放时,我需要能够将文本移动到适当的位置.
在我的 WPF 应用程序中,我有一个 D3 ChartPlotter,可以在其中绘制 4 个折线图。这是 XAML 代码:
<d3:ChartPlotter Name="plotter">
<d3:ChartPlotter.HorizontalAxis>
<d3:HorizontalAxis Name="timeAxis" />
</d3:ChartPlotter.HorizontalAxis>
<d3:ChartPlotter.VerticalAxis>
<d3:VerticalAxis Name="accelerationAxis" />
</d3:ChartPlotter.VerticalAxis>
</d3:ChartPlotter>
Run Code Online (Sandbox Code Playgroud)
其中d3是 DinamicDataDisplay 的命名空间,这是后面的代码(相关部分)。
var x = new List<int>();
var y = new List<int>();
for (var t = 0; t <= 10; t = t + 1) {
x.Add(t);
y.Add(Math.Pow(t,2));
}
var xCoord = new EnumerableDataSource<int>(x);
xCoord.SetXMapping(t => t);
var yCoord = new EnumerableDataSource<int>(y);
yCoord.SetYMapping(k => k);
CompositeDataSource plotterPoints = new CompositeDataSource(xCoord, yCoord);
plotter.AddLineGraph(plotterPoints, Brushes.Red.Color , 2, …Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个项目,它将从我的COM端口获取实时数据,然后显示它以便于解释.其中一部分是使用动态数据显示创建折线图,我希望它也能实现.
我目前有一个工作设置,它将来自集合的数据汇总在一起,并以可读的格式输出给绘图仪,虽然这对我的静态样本数据来说很好,但我担心考虑到数据会更新很多,这远远没有优化(有时每秒多次).始终发送数据已更改的通知会使图表刷新,但始终提取所有数据并创建新的图源似乎远非有效.我在我的视图模型中使用以下代码:
private CompositeDataSource _AccelXData;
public CompositeDataSource AccelXData
{
get
{
var xData = new EnumerableDataSource<int>(dataItems.Select(v => v.id));
xData.SetXMapping(x => x);
var yData = new EnumerableDataSource<double>(dataItems.Select(v => v.accelX));
yData.SetYMapping(y => y);
_AccelXData = xData.Join(yData);
return _AccelXData;
}
}
Run Code Online (Sandbox Code Playgroud)
我有多个运行的,每个代表一个图形(例如x,y和z轴上的加速度).他们必须遵循示例图表:
<d3:ChartPlotter Name="plotter" DockPanel.Dock="Top" Margin="5">
<d3:LineGraph DataSource="{Binding AccelXData}" />
<d3:LineGraph DataSource="{Binding AccelYData}" />
<d3:LineGraph DataSource="{Binding AccelZData}" />
</d3:ChartPlotter>
Run Code Online (Sandbox Code Playgroud)
关于这个我想知道的两件事:是否有可能编写一个函数来处理所有数据输出,我不必一遍又一遍地复制相同的代码?更重要的是,一旦我的Collection更新而不是一遍又一遍地重新收集所有数据,那么简单地将值添加到我的折线图中的最佳方法是什么?
有没有人知道是否有办法改变D3线图上的Y轴限制?
我正在使用Codeplex源代码中的最新版本... WPF版本,而不是Silverlight版本.
我正在绘制来自Android传感器的读数,并且范围值会发生很大变化.有时它大约为零,图表看起来像这样:

然后值的大小发生变化,Y轴重新调整以显示整个数据,图形现在如下所示:

查看Y值如何从图1更改为2.
我想要的是使Y轴具有我选择的固定值,比如-10到+10.然后图表将始终以相同的比例绘制.
有没有办法做到这一点?
图的XAML代码是这样的:
<d3:ChartPlotter
Name="gyroGraph"
Margin="21,5,10,0"
Grid.ColumnSpan="2"
Background="White"
Grid.Row="1"
LegendVisibility="Collapsed"
NewLegendVisible="False"
MainHorizontalAxisVisibility="Collapsed"
MainVerticalAxisVisibility="Collapsed">
<d3:VerticalAxis
FontSize="8" />
<d3:Header
Content="Angular Velocity"
FontSize="11" />
</d3:ChartPlotter>
Run Code Online (Sandbox Code Playgroud)
谢谢和最好的问候,罗德里戈巴斯尼亚克
我正在处理一个应用程序一切正常,但我得到例外
枚举尚未启动或已完成.
这是我生成此异常的代码.
for (int i = 0; i < SelectedItems.Count; i++)
{
lineDS = new DataSet();
datDs = new DataSet();
datDs = DatelineData(SelectedItems[i].ToString(), Starttime, Endtime, NUDTextBox, txtSensorLess, dtpStartDate, dtpEndDate);
lineDS =GraphlineDraw(SelectedItems[i].ToString(),Starttime,Endtime,NUDTextBox,txtSensorLess,dtpStartDate,dtpEndDate);
if (datDs.Tables[0].Rows.Count > 0 & lineDS.Tables[0].Rows.Count > 0)
{
var dates = (from dr in datDs.Tables[0].AsEnumerable()
select new
{
date = dr.Field<DateTime>("DateRecorded"),
}.date).ToList();
var Rate = (from dr in lineDS.Tables[0].AsEnumerable()
select new
{
rate = dr.Field<double>(SelectedItems[i])
}.rate).ToList();
var datesDataSource = new EnumerableDataSource<DateTime>(dates);
datesDataSource.SetXMapping(x => dateAxis.ConvertToDouble(x));
var RateDataSource = …Run Code Online (Sandbox Code Playgroud) 我正在使用一个开源图表库,在图表上创建标记.(动态数据显示)我正在创建的标记是使用Rect对象创建的.我注意到System.Windows.Shapes中的所有Shapes都有一个ToolTip属性,但System.Windows.Rect没有.我希望弹出一个工具提示,告诉用户当鼠标悬停在标记上时标记的价格值.当鼠标进入rect占据的区域时,我正在考虑创建并弹出一个工具提示,但我不知道有多少可能考虑到矩形将被图表缩放/平移.还有其他建议吗?
这是我正在创建的标记的代码(来自Felice Pollano博客)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Shapes;
using System.Windows.Controls;
using System.Text;
using System.Windows;
using System.Windows.Media;
namespace Microsoft.Research.DynamicDataDisplay.PointMarkers
{
public class CandleStickPointMarker:ShapePointMarker,ITransformAware
{
public double CandlestickWidth
{
get { return (double)GetValue(CandlestickWidthProperty); }
set { SetValue(CandlestickWidthProperty, value); }
}
public static readonly DependencyProperty CandlestickWidthProperty =
DependencyProperty.Register("CandlestickWidth", typeof(double), typeof(CandleStickPointMarker), new UIPropertyMetadata(4.0));
public double CandlestickStrokeWidth
{
get { return (double)GetValue(CandlestickStrokeWidthProperty); }
set { SetValue(CandlestickStrokeWidthProperty, value); }
}
public static readonly DependencyProperty CandlestickStrokeWidthProperty =
DependencyProperty.Register("CandlestickStrokeWidth", typeof(double), typeof(CandleStickPointMarker), new UIPropertyMetadata(1.0));
public Brush …Run Code Online (Sandbox Code Playgroud) 我试图使用JSTL显示数据库数据,如下所示:
我的道
public ArrayList getStudentFirstName(){
ArrayList v = new ArrayList();
Connection conn;
try{
conn = db.getDbConnection();
String sql = "select STU_FIRST_NAME, STU_MIDDLE_NAME, LAST_NAME from college_students_master";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String firstname = rs.getString("STU_FIRST_NAME");
String middlename = rs.getString("STU_MIDDLE_NAME");
String lastname = rs.getString("LAST_NAME");
v.add(firstname);
v.add(middlename);
v.add(lastname);
}
}catch(Exception asd){
System.out.println(asd.getMessage());
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
我的servlet:
public class displayservlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DetailsDao dd = new DetailsDao(); …Run Code Online (Sandbox Code Playgroud) 我有一个动态数据显示图表.我正在使用ChartPlotter.它有一个默认的X和Y轴.我需要添加一个额外的X轴和两个Y轴.如何在XAML中实现此功能并在代码中动态实现?
开发人员可以使用这些图表通过提供轴编号的枚举(例如,Y1,Y2,Y3等)或X1,X2将数据附加到这些轴中的任何一个.目前我想拥有上述数量有限的轴.
有人可以帮我解决这个问题吗?我知道要添加注入绘图仪但是我必须添加多个注入绘图仪吗?如果轴数确实增加,我还需要添加多少?感觉有点低效,因此将轴添加到单个ChartPlotter的问题.
我使用 Microsoft InteractiveDataDisplay.WPF(以前的 DynamicDataDisplay)来可视化实时数据(大约 2-3 秒)。此代码 xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
double[] y = new double[200];
double[] x = new double[200];
for (int i = 0; i < 200; i++)
{
y[i] = 3.1415 * i / (y.Length - 1);
x[i] = DateTime.Now.AddMinutes(-i).ToOADate();
}
linegraph.Plot(x, y);
}
}
Run Code Online (Sandbox Code Playgroud)
使用这个 xaml:
<d3:Chart Name="plotter">
<d3:Chart.Title>
<TextBlock HorizontalAlignment="Center" FontSize="18" Margin="0,5,0,5">chart sample</TextBlock>
</d3:Chart.Title>
<d3:LineGraph x:Name="linegraph" Description="Simple linegraph" Stroke="Blue" StrokeThickness="3">
</d3:LineGraph>
</d3:Chart>
Run Code Online (Sandbox Code Playgroud)
任何想法如何做到这一点?谢谢!
更新 1(使用 …