【问题标题】:Range Overlap Bar Chart范围重叠条形图
【发布时间】:2023-04-05 08:59:01
【问题描述】:

我正在创建一个范围重叠条形图,它应该在单个条形中显示多值并且应该改变颜色。为了把我想说的说清楚,我画了一个平局:

【问题讨论】:

  • 单条中的多值是什么意思?一个条形对应一个值...
  • 看看这个:google.cz/…
  • 你有什么问题?这是WPF还是Winforms? (你都标记了)
  • IMO 这是题外话,因为这只是找到一些可以完成这项工作的图表库的问题。

标签: c# wpf winforms charts bar-chart


【解决方案1】:

您可以在 Visual Studio 工具箱中使用 Microsoft 图表控件。您必须创建多个系列,因为您想显示重叠图表。这个link 会帮助你。

这是一些代码...

DataSet dataSet;
ConnectionClass.GetInstance().connection_string = Properties.Settings.Default.MindMuscleConnectionString;
ConnectionClass.GetInstance().Sql = "Select Count(MemberInfo.memberName) as 'Members', CompetitionName as 'Competition' FROM MemberInfo, MemberBodyInfo, Competition WHERE MemberInfo.memberID = MemberBodyInfo.memberID AND MemberBodyInfo.weight >= Competition.CompetitionCategory and MemberBodyInfo.weight <= Competition.CompetitionCategory + 5 group by CompetitionName;";
dataSet = ConnectionClass.GetInstance().GetConnection;
chart1.Series["Series1"].Name = "Members";
chart1.Series["Members"].YValueMembers = "Members";
chart1.Series["Members"].XValueMember = "Competition";
chart1.Series.Add("Members2");
chart1.Series["Members2"].ChartType = SeriesChartType.StackedColumn;
chart1.Series["Members2"].IsValueShownAsLabel = true;
chart1.Series["Members2"].YValueMembers = "Members";
chart1.Series["Members2"].XValueMember = "Competition";
this.chart1.Titles.Add("Competition Participants");   // Set the chart title
chart1.Series["Members"].ChartType = SeriesChartType.StackedColumn;
chart1.Series["Members"].IsValueShownAsLabel = true;  // To show chart value 
chart1.DataSource = dataSet;
chart1.DataBind();

它看起来像:

我实际上并没有根据一些不同的数据创建一个新系列...这两个系列在这里都是相同的,但我只是向您展示了一个示例。您必须使用您的数据填充您的系列。

现在如果你改变了

chart1.Series["Members2"].ChartType = SeriesChartType.StackedColumn;
chart1.Series["Members"].ChartType = SeriesChartType.StackedColumn;

chart1.Series["Members2"].ChartType = SeriesChartType.StackedBar;
chart1.Series["Members"].ChartType = SeriesChartType.StackedBar;

图表与您的绘图一模一样:

【讨论】:

    【解决方案2】:
    <UserControl x:Class="Budget.Summary.UserCtrlChartCategories"
             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:dxc="http://schemas.devexpress.com/winfx/2008/xaml/charts" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
             xmlns:local="clr-namespace:Budget.Summary"
             mc:Ignorable="d" x:Name="userCtrl"
             d:DesignHeight="450" d:DesignWidth="800" 
             Loaded="UserControl_Loaded" 
             Unloaded="UserControl_Unloaded" >
    <UserControl.Resources>
        <Style x:Key="MyExpenseBarDataPointStyle" TargetType="{x:Type chartingToolkit:BarDataPoint}">
            <Setter Property="Height" Value="20" />
            <Setter Property="Background" Value="Red" />
            <Setter Property="BorderBrush"  Value="Black" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="IsTabStop" Value="False" />
            <Setter Property="RenderTransformOrigin" Value="0.5, 0.5"/>
            <Setter Property="RenderTransform" >
                <Setter.Value>
                    <TransformGroup>
                        <ScaleTransform ScaleY="1.0"/>
                        <TranslateTransform  Y="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType=chartingToolkit:BarDataPoint},Converter={StaticResource NegativeValueConverter}}" />
                    </TransformGroup>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:BarDataPoint}">
                        <Border x:Name="Root"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}">
                            <Border.ToolTip>
                                <ContentControl Content="{TemplateBinding FormattedDependentValue}" />
                            </Border.ToolTip>
                            <Grid Background="{TemplateBinding Background}">
                                <Rectangle>
                                    <Rectangle.Fill>
                                        <LinearGradientBrush>
                                            <GradientStop Color="#77FFFFFF"  Offset="0" />
                                            <GradientStop Color="Transparent" Offset="1" />
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                                <Border BorderBrush="#CCFFFFFF"  BorderThickness="1">
                                    <Border BorderBrush="#77FFFFFF"  BorderThickness="1" />
                                </Border>
                                <Rectangle x:Name="SelectionHighlight" Fill="Red" Opacity="0" />
                                <Rectangle x:Name="MouseOverHighlight" Fill="White" Opacity="0" />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="MyBudgetBarDataPointStyle"
         TargetType="{x:Type chartingToolkit:BarDataPoint}">
            <Setter Property="Background" Value="Green" />
            <Setter Property="BorderBrush"  Value="Black" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="IsTabStop" Value="False" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:BarDataPoint}">
                        <Border x:Name="Root"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}">
                            <Border.ToolTip>
                                <ContentControl Content="{TemplateBinding FormattedDependentValue}" />
                            </Border.ToolTip>
                            <Grid Background="{TemplateBinding Background}">
                                <Rectangle>
                                    <Rectangle.Fill>
                                        <LinearGradientBrush>
                                            <GradientStop Color="#77FFFFFF"  Offset="0" />
                                            <GradientStop Color="Transparent" Offset="1" />
                                        </LinearGradientBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                                <Border BorderBrush="#CCFFFFFF"  BorderThickness="1">
                                    <Border BorderBrush="#77FFFFFF"  BorderThickness="1" />
                                </Border>
                                <Rectangle x:Name="SelectionHighlight" Fill="Red" Opacity="0" />
                                <Rectangle x:Name="MouseOverHighlight" Fill="White" Opacity="0" />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    
    
    <Grid>
        <Grid >
            <!--https://www.c-sharpcorner.com/UploadFile/mahesh/bar-chart-in-wpf/-->
            <chartingToolkit:Chart x:Name="LineChart"  
                Title="{Binding Title,RelativeSource={RelativeSource AncestorType=UserControl}}" Margin="10,10,10,0" 
                   Background="LightBlue" >
                <chartingToolkit:Chart.Resources>
                </chartingToolkit:Chart.Resources>
    
                <chartingToolkit:Chart.Axes>
                    <chartingToolkit:LinearAxis  Orientation="X" />
                </chartingToolkit:Chart.Axes>
            </chartingToolkit:Chart>
        </Grid>
    </Grid>
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:
    Style MyExpenseBarDataPointStyle = (Style)this.FindResource("MyExpenseBarDataPointStyle");
    Style MyBudgetBarDataPointStyle = (Style)this.FindResource("MyBudgetBarDataPointStyle");
    BarSeries barSeriesExpense = new BarSeries();
    barSeriesExpense.Name = Name.Replace(" ", "");
    BarSeries barSeriesBudget = new BarSeries();
    barSeriesBudget.Title = "Budget";
    barSeriesBudget.Name = Name.Replace(" ", "");
    barSeriesExpense.Title = "Dépense";
    barSeriesExpense.DataPointStyle = MyExpenseBarDataPointStyle;
    barSeriesBudget.DataPointStyle = MyBudgetBarDataPointStyle;
    
    
    barSeriesExpense.IndependentValueBinding = new Binding("Key"); //date  l'axe des X
    barSeriesExpense.DependentValueBinding = new Binding("Value"); //money l'axe des Y
    barSeriesBudget.IndependentValueBinding = new Binding("Key"); //date  l'axe des X
    barSeriesBudget.DependentValueBinding = new Binding("Value"); //money l'axe des Y
    barSeriesExpense.ItemsSource = dataSource;
    barSeriesBudget.ItemsSource = dataSourceMax;
    LineChart.Series.Add(barSeriesBudget);
    LineChart.Series.Add(barSeriesExpense);
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 这是一个在代码中将 2 个条形系列添加到图表的示例。在 XAML 中,我们使用渲染转换修改 bardatapoint 样式,以垂直移动最后一个序列以与第一个序列重叠。
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多