【问题标题】:Correlation heat map for windows presentation foundationWindows Presentation Foundation 的相关热图
【发布时间】:2011-09-05 13:39:36
【问题描述】:

有没有人知道为 WPF 绘制相关热图的好工具?

基于 cmets 的示例:

原图source

【问题讨论】:

  • 请参阅en.wikipedia.org/wiki/Heat_map 了解热图的定义。抱歉,您要的不是一张。充其量我会说您是在询问如何更改表格中单元格的背景...

标签: wpf visualization data-visualization heatmap


【解决方案1】:

免费的 WPF 工具包有一个 TreeMap。您可以在 XAML 中定义如下:

<vis:TreeMap ItemsSource="{Binding Path=HeatMap.Sectors}"
              Interpolators="{StaticResource colourInterpolator}">
  <vis:TreeMap.ItemDefinition>
    <vis:TreeMapItemDefinition ValueBinding="{Binding MarketCap}">
      <DataTemplate>
        <Grid>
          <Border x:Name="Border"
                  BorderBrush="Black"
                  BorderThickness="1"
                  Margin="1"
                  Opacity="0.5">                      
          </Border>
          <TextBlock Text="{Binding Name}"
                     TextWrapping="Wrap"
                     FontSize="20"
                     Margin="5"
                     VerticalAlignment="Center"
                     HorizontalAlignment="Center"/>
        </Grid>
      </DataTemplate>
    </vis:TreeMapItemDefinition>
  </vis:TreeMap.ItemDefinition>
</vis:TreeMap>

上面的 XAML 是我编写的一个显示金融热图的应用程序的 sn-p。您可以在此处查看正在运行的 Silverlight 版本:

http://www.scottlogic.co.uk/blog/colin/xaml-finance/

(只需点击“热图”按钮)

【讨论】:

  • 这似乎和我想要的有点不同。我正在寻找这样的相关热图 - lcchong.files.wordpress.com/2011/05/… 无论如何谢谢
  • 好的——你需要一个DataGrid!有一个非常好的 DataGrid,它是 WPF 框架的一部分。
  • 我想我会沿着这条路走:)
  • Datagrid 本身并没有提供简单的方法来制作热图
  • @rolls,可能与stackoverflow.com/questions/5549617/…重复
【解决方案2】:

如果您正在寻找商业产品,我建议您查看 Telerik 控件。 Telerik 具有出色的 WPF 控件。长列表中包括一个热图控件。这是他们列出热图功能的网站的链接:

http://www.telerik.com/products/wpf/map.aspx

如果您正在寻找构建一些东西,这里有几篇博客文章介绍了如何去做(提供了源代码):

http://www.garrettgirod.com/?p=111

http://www.nickdarnell.com/?p=833

【讨论】:

【解决方案3】:

Syncfusion charting component 似乎提供了热图。

【讨论】:

  • 感谢您的回答,但我正在寻找这样的相关热图 - lcchong.files.wordpress.com/2011/05/…
  • @Xenofonte:我已编辑您的问题以包含此内容。正如其他人所说,这类似于数据网格,但可能需要编写和维护一些代码来实现您想要的可视化。值得检查的是同步融合或 Telerik 控件是否需要较少的自定义。
【解决方案4】:

不是免费的组件,但如果您可以使用 Telerik 库,您可以使用以下内容:

http://www.telerik.com/products/wpf/heatmap.aspx

我过去曾在几个项目中使用过它,而且效果很好。

【讨论】:

    【解决方案5】:

    我使用带有自定义 ColorFormatter 行为的 DevExpress。我在市场上找不到任何开箱即用的产品。这花了我几天的时间来开发。我的代码附在下面,希望这对那里的人有所帮助。

    编辑:我使用了 POCO 视图模型和 MVVM,但是您可以根据需要将其更改为不使用 POCO。

    Table2DViewModel.cs

    namespace ViewModel
    {
        [POCOViewModel]
        public class Table2DViewModel
        {
            public ITable2DView Table2DView { get; set; }
    
            public DataTable ItemsTable { get; set; }
    
    
            public Table2DViewModel()
            {
            }
    
            public Table2DViewModel(MainViewModel mainViewModel, ITable2DView table2DView) : base(mainViewModel)
            {
                Table2DView = table2DView;   
                CreateTable();
            }
    
            private void CreateTable()
            {
                var dt = new DataTable();
                var xAxisStrings = new string[]{"X1","X2","X3"};
                var yAxisStrings = new string[]{"Y1","Y2","Y3"};
    
                //TODO determine your min, max number for your colours
                var minValue = 0;
                var maxValue = 100;
                Table2DView.SetColorFormatter(minValue,maxValue, null);
    
                //Add the columns
                dt.Columns.Add(" ", typeof(string));
                foreach (var x in xAxisStrings) dt.Columns.Add(x, typeof(double));
    
                //Add all the values
                double z = 0;
                for (var y = 0; y < yAxisStrings.Length; y++)
                {
                    var dr = dt.NewRow();
                    dr[" "] = yAxisStrings[y];
                    for (var x = 0; x < xAxisStrings.Length; x++)
                    {
                        //TODO put your actual values here!
                        dr[xAxisStrings[x]] = z++; //Add a random values
                    }
                    dt.Rows.Add(dr);
                }
                ItemsTable = dt;
            }
    
    
            public static Table2DViewModel Create(MainViewModel mainViewModel, ITable2DView table2DView)
            {
                var factory = ViewModelSource.Factory((MainViewModel mainVm, ITable2DView view) => new Table2DViewModel(mainVm, view));
                return factory(mainViewModel, table2DView);
            }
        }
    
    }
    

    ITable2DView.cs

    namespace Interfaces
        {
            public interface ITable2DView
            {
                void SetColorFormatter(float minValue, float maxValue, ColorScaleFormat colorScaleFormat);
            }
        }
    

    Table2DView.xaml.cs

    namespace View
    {
        public partial class Table2DView : ITable2DView
        {
            public Table2DView()
            {
                InitializeComponent();
            }
    
            static ColorScaleFormat defaultColorScaleFormat = new ColorScaleFormat
            {
                ColorMin = (Color)ColorConverter.ConvertFromString("#FFF8696B"),
                ColorMiddle = (Color)ColorConverter.ConvertFromString("#FFFFEB84"),
                ColorMax = (Color)ColorConverter.ConvertFromString("#FF63BE7B")
            };
    
            public void SetColorFormatter(float minValue, float maxValue, ColorScaleFormat colorScaleFormat = null)
            {
                if (colorScaleFormat == null) colorScaleFormat = defaultColorScaleFormat;
                ConditionBehavior.MinValue = minValue;
                ConditionBehavior.MaxValue = maxValue;
                ConditionBehavior.ColorScaleFormat = colorScaleFormat;
            }
        }
    }
    

    DynamicConditionBehavior.cs

    namespace Behaviors
    {
        public class DynamicConditionBehavior : Behavior<GridControl>
        {
            GridControl Grid => AssociatedObject;
    
            protected override void OnAttached()
            {
                base.OnAttached();
                Grid.ItemsSourceChanged += OnItemsSourceChanged;
            }
    
            protected override void OnDetaching()
            {
                Grid.ItemsSourceChanged -= OnItemsSourceChanged;
                base.OnDetaching();
            }
    
            public ColorScaleFormat ColorScaleFormat { get; set;}
            public float MinValue { get; set; }
            public float MaxValue { get; set; }
    
            private void OnItemsSourceChanged(object sender, EventArgs e)
            {
                var view = Grid.View as TableView;
    
                if (view == null) return;
    
                view.FormatConditions.Clear();
    
                foreach (var col in Grid.Columns)
                {
                    view.FormatConditions.Add(new ColorScaleFormatCondition
                    {
                        MinValue = MinValue,
                        MaxValue = MaxValue,
                        FieldName = col.FieldName,
                        Format = ColorScaleFormat,
                    });
                }
    
            }
        }
    }
    

    Table2DView.xaml

    <UserControl x:Class="View"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" 
                 xmlns:ViewModels="clr-namespace:ViewModel"
                 xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
                 xmlns:behaviors="clr-namespace:Behaviors"
                 xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking"
                 DataContext="{dxmvvm:ViewModelSource Type={x:Type ViewModels:ViewModel}}"
                 mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="800">
    
        <UserControl.Resources>
            <Style TargetType="{x:Type dxg:GridColumn}">
                <Setter Property="Width" Value="50"/>
                <Setter Property="HorizontalHeaderContentAlignment" Value="Center"/>
            </Style>
    
            <Style TargetType="{x:Type dxg:HeaderItemsControl}">
                <Setter Property="FontWeight" Value="DemiBold"/>
            </Style>
        </UserControl.Resources>
    
            <!--<dxmvvm:Interaction.Behaviors>
                <dxmvvm:EventToCommand EventName="" Command="{Binding OnLoadedCommand}"/>
            </dxmvvm:Interaction.Behaviors>-->
            <dxg:GridControl ItemsSource="{Binding ItemsTable}"
                         AutoGenerateColumns="AddNew"
                         EnableSmartColumnsGeneration="True">
    
            <dxmvvm:Interaction.Behaviors >
                <behaviors:DynamicConditionBehavior x:Name="ConditionBehavior" />
                </dxmvvm:Interaction.Behaviors>
                <dxg:GridControl.View>
                    <dxg:TableView ShowGroupPanel="False"
                               AllowPerPixelScrolling="True"/>
                </dxg:GridControl.View>
            </dxg:GridControl>
      </UserControl>
    

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多