Удалить элемент из ColumnSeries

Используя Oxyplot, как мне удалить элемент из данного ColumnSeries?

Учитывая код, который является примером, представленным в самой библиотеке (с небольшой модификацией), а также какое-то событие Delete (которое я мог бы выяснить сам), как бы я удалил элемент (столбец) из графика?

Если я просто удалю элемент из бара. Список элементов, Метка не исчезнет. Удаление его из tmp.Axes[0].ActualLabels (который является CategoryAxis) не "обновит" представление, и метка останется там. Есть ли решение для этой ситуации? Мне удалось сделать это с помощью линейных и круговых диаграмм, но я борюсь с колонной.

Код для создания Графа:

namespace ColumnSeriesDemo
{
    using System.Collections.ObjectModel;
    using System.Windows;

    using OxyPlot;
    using OxyPlot.Axes;
    using OxyPlot.Series;

    using WpfExamples;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    [Example("Shows column series.")]
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();

            // Create some data
            this.Items = new Collection<Item>
                            {
                                new Item {Label = "Apples", Value1 = 37, Value2 = 12, Value3 = 19},
                                new Item {Label = "Pears", Value1 = 7, Value2 = 21, Value3 = 9},
                                new Item {Label = "Bananas", Value1 = 23, Value2 = 2, Value3 = 29}
                            };

            // Create the plot model
            var tmp = new PlotModel { Title = "Column series", LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightTop, LegendOrientation = LegendOrientation.Vertical };

            // Add the axes, note that MinimumPadding and AbsoluteMinimum should be set on the value axis.
            tmp.Axes.Add(new CategoryAxis { ItemsSource = this.Items, LabelField = "Label" });
            tmp.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MinimumPadding = 0, AbsoluteMinimum = 0 });

            // Add the series, note that the BarSeries are using the same ItemsSource as the CategoryAxis.
            ColumnSeries bar = new ColumnSeries();
            tmp.Series.Add(bar);
            bar.Items.Add(new ColumnItem { Color = OxyPlot.OxyColors.Yellow, Value = this.Items[0].Value3, CategoryIndex = 0 });
            bar.Items.Add(new ColumnItem { Color = OxyPlot.OxyColors.Green, Value = this.Items[0].Value2, CategoryIndex = 2 });
            bar.Items.Add(new ColumnItem { Color = OxyPlot.OxyColors.Red, Value = this.Items[0].Value1, CategoryIndex = 3 });


            this.Model1 = tmp;

            this.DataContext = this;
        }

        public Collection<Item> Items { get; set; }

        public PlotModel Model1 { get; set; }
    }

    public class Item
    {
        public string Label { get; set; }
        public double Value1 { get; set; }
        public double Value2 { get; set; }
        public double Value3 { get; set; }
    }
}

1 ответ

Решение

Я не совсем уверен, что знаю, что вы пытаетесь сделать, но я надеюсь, что это поможет вам:

Я взял образец и немного поиграл с твоим кодом и примером. Я думаю, что проблема с вашим кодом в том, что у вас есть привязка в вашем CategoryAxis, но данные не добавляются с привязкой, но прямо в вашем ColumnSeries, Используя ваш код, я оставил первую часть как есть, а вместо ColumnSeries bar = new ColumnSeries() Я сделал:

        ColumnSeries bar = new ColumnSeries
        {
            FillColor = OxyPlot.OxyColors.Yellow,
            ValueField = "Value1",
            Title = "Value1",
            ItemsSource = Items
        };
        tmp.Series.Add(bar);

Таким образом, данные в Items связан как в вашем CategoryAxis и в вашем ColumnSeries (конечно, если вам нужно больше столбцов, представляющих Value2 а также Value3 ценности вашего Items класс вы можете добавить новый ColumnSeries к серии вашего PlotModel)

Затем я добавил кнопку в окно, и в коде позади:

        Items.RemoveAt(0);
        Model1.InvalidatePlot(true);

И это обновляет участок, удаляя (каждый раз) первый ColumnSeries включая ярлык в CategoryAxis,

Код окна позади:

using System.Collections.ObjectModel;
using System.Windows;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;

namespace OxyPlot_TEST
{
    /// <summary>
    /// Interaction logic for Window2.xaml
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            // Create some data
            this.Items = new Collection<Item>
                            {
                                new Item {Label = "Apples", Value1 = 37, Value2 = 12, Value3 = 19},
                                new Item {Label = "Pears", Value1 = 7, Value2 = 21, Value3 = 9},
                                new Item {Label = "Bananas", Value1 = 23, Value2 = 2, Value3 = 29}
                            };

            // Create the plot model
            var tmp = new PlotModel { Title = "Column series", LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightTop, LegendOrientation = LegendOrientation.Vertical };

            // Add the axes, note that MinimumPadding and AbsoluteMinimum should be set on the value axis.
            tmp.Axes.Add(new CategoryAxis { ItemsSource = this.Items, LabelField = "Label" });
            tmp.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MinimumPadding = 0, AbsoluteMinimum = 0 });

            ColumnSeries bar = new ColumnSeries
            {
                FillColor = OxyPlot.OxyColors.Yellow,
                ValueField = "Value1",
                Title = "Value1",
                ItemsSource = Items
            };
            ColumnSeries bar1 = new ColumnSeries
            {
                FillColor = OxyPlot.OxyColors.Green,
                ValueField = "Value1",
                Title = "Value1",
                ItemsSource = Items
            };
            ColumnSeries bar2 = new ColumnSeries
            {
                FillColor = OxyPlot.OxyColors.Red,
                ValueField = "Value1",
                Title = "Value1",
                ItemsSource = Items
            };
            tmp.Series.Add(bar);
            tmp.Series.Add(bar1);
            tmp.Series.Add(bar2);

            this.Model1 = tmp;
            this.DataContext = this;
        }

        public Collection<Item> Items { get; set; }

        public PlotModel Model1 { get; set; }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Items.RemoveAt(0);
            Model1.InvalidatePlot(true);
        }
    }

    public class Item
    {
        public string Label { get; set; }
        public double Value1 { get; set; }
        public double Value2 { get; set; }
        public double Value3 { get; set; }
    }
}

<< --------------------------------- РЕДАКТИРОВАТЬ -------------- ------------------- >>

Если вам нужен только один столбец для каждой категории, вам нужно только одно значение для каждого элемента. Затем вы можете (как в предыдущем примере) удалить или даже добавить элементы из / в коллекцию (обновление графика с использованием InvalidatePlot, Code-Behind:

using System.Collections.ObjectModel;
using System.Windows;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;

namespace OxyPlot_TEST
{
    /// <summary>
    /// Interaction logic for Window2.xaml
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            // Create some data
            this.Items = new Collection<Item>
                            {
                                new Item {Label = "Apples", Value1 = 37},
                                new Item {Label = "Pears", Value1 = 7},
                                new Item {Label = "Bananas", Value1 = 23}
                            };

            // Create the plot model
            var tmp = new PlotModel { Title = "Column series", LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightTop, LegendOrientation = LegendOrientation.Vertical };

            // Add the axes, note that MinimumPadding and AbsoluteMinimum should be set on the value axis.
            tmp.Axes.Add(new CategoryAxis { ItemsSource = this.Items, LabelField = "Label" });
            tmp.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MinimumPadding = 0, AbsoluteMinimum = 0 });

            ColumnSeries bar = new ColumnSeries
            {
                FillColor = OxyPlot.OxyColors.Black,
                ValueField = "Value1",
                Title = "Value1",
                ItemsSource = Items
            };
            tmp.Series.Add(bar);

            this.Model1 = tmp;
            this.DataContext = this;
        }

        public Collection<Item> Items { get; set; }

        public PlotModel Model1 { get; set; }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Items.RemoveAt(0);
            Model1.InvalidatePlot(true);
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            Items.Add(new Item()
            {
                Label = "Strawberrys", Value1 = 55
            });
            Model1.InvalidatePlot(true);
        }
    }

    public class Item
    {
        public string Label { get; set; }
        public double Value1 { get; set; }
    }
}
Другие вопросы по тегам