2011-05-31 12 views
5

¿Alguien sabe alguna buena herramienta para dibujar mapas de calor de correlación para WPF?Mapa de calor de correlación para la base de presentación de Windows

Ejemplo basado en los comentarios:

enter image description here

imagen original source

+0

Por favor, vea http://en.wikipedia.org/wiki/Heat_map para la definición de un mapa de calor .. Lo que están pidiendo no es uno, lo siento En el mejor de los casos, diría que está preguntando cómo cambiar el fondo de una celda en una tabla ... –

Respuesta

2

Si usted está buscando un producto comercial, sugeriría nos fijamos en los controles de Telerik. Telerik tiene excelentes controles para WPF. Incluido en la lista larga es un control de mapa de calor. Aquí hay un enlace al sitio en el que la lista de los mapas de calor:

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

Si usted está buscando para construir algo, aquí están los artículos par de blogs que jalonan cómo hacerlo (con fuente incluida) :

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

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

+0

Gracias por su respuesta, pero estoy buscando un mapa de calor de correlación como este - http: //lcchong.files .wordpress.com/2011/05/image_thumb.png? w = 644 & h = 206 – Xenofonte

7

La libre WPF Toolkit tiene una TreeMap. Se puede definir en XAML de la siguiente manera:

<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> 

El XAML anterior es un fragmento de una aplicación que he escrito que muestra Heatmaps financieros. Se puede ver una versión de Silverlight correr aquí:

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

(simplemente pulse el botón 'mapa de calor')

+0

Parece un poco diferente de lo que quiero. Estoy buscando un mapa de calor de correlación como este - http://lcchong.files.wordpress.com/2011/05/image_thumb.png?w=644&h=206 Gracias de todos modos – Xenofonte

+0

OK - ¡usted necesita un DataGrid! Hay un DataGrid perfectamente bueno que es parte del marco WPF. – ColinE

+0

Creo que iré por esa ruta :) – Xenofonte

2

El Syncfusion charting component parece proporcionar mapas de calor.

+1

Gracias por su respuesta, pero estoy buscando un mapa de calor de correlación como este - http://lcchong.files.wordpress.com/2011/05/image_thumb.png?w=644&h=206 – Xenofonte

+1

@ Xenofonte: He editado su pregunta para incluir esto. Como otros han dicho, esto es similar a una cuadrícula de datos, pero probablemente haya algún código para escribir y mantener para la visualización que desee. Vale la pena comprobar si los controles syncfusion o telerik requieren menos personalización. –

1
No

un componente libre, pero si usted puede conseguir sus manos en la biblioteca Telerik podría utilizar el siguiente:

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

he tenido que usarlo en el pasado por algunos proyectos y funcionó bastante bien

0

Utilicé DevExpress con un comportamiento personalizado ColorFormatter. No pude encontrar nada en el mercado que hiciera esto de la caja. Esto me llevó unos días en desarrollarme. Mi código se adjuntó a continuación, con suerte, esto ayuda a alguien por ahí.

Editar: He usado modelos de vista POCO y MVVM sin embargo, puede cambiar esto para no utilizar POCO si lo desea.

Example

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> 
Cuestiones relacionadas