Вам придется извлекать данные для каждого города отдельно, отфильтровывая фрейм данных.
# df = your dataframe with all the data
towns = ['A', 'B', 'C']
for town in towns:
town_df = df[df['town'] == town]
plt.plot(town_df['week'], town_df['price'], label=town)
plt.legend()
plt.xlabel('Week')
plt.ylabel('Price')
plt.title('Price Graph')
plt.show()
Вывод:
Я сделал это для графика цен, вы можете аналогичным образом создать график с продажами в качестве оси Y, используя те же шаги
Вот другая опция. Переопределите шаблон по умолчанию для SCrollviewer и обработайте кнопки как PageUp/PageDown. Моим примером ниже является scrollviewer, который прокручивает вертикально. Можно легко измениться на к горизонтальной прокрутке и изменить обработчики с PageUp/PageDown на Левые и правые обработчики.
<ControlTemplate TargetType="{x:Type ScrollViewer}" x:Key="ButtonOnlyScrollViewer">
<ControlTemplate.Resources>
<!-- Add style here for repeat button seen below -->
</ControlTemplate.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<RepeatButton Grid.Row="0"
Foreground="White"
Background="Yellow"
HorizontalAlignment="Stretch"
Command="ScrollBar.PageUpCommand"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}">
</RepeatButton>
<ScrollContentPresenter
CanContentScroll="{TemplateBinding CanContentScroll}"
Grid.Row="1"
Content="{TemplateBinding Content}"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
Margin="{TemplateBinding Margin}"/>
<RepeatButton Grid.Row="2" Background="Black" Foreground="White" Command="ScrollBar.PageDownCommand">
</RepeatButton>
</Grid>
</ControlTemplate>
Я сделал что-то подобное и лучший способ, которым я нашел, чтобы сделать, это должно было поместить Ваше содержание в средство просмотра прокрутки и просто выключить полосы прокрутки. Затем кодируйте свои кнопки для прокрутки scrollviewer.
Править: Ответ на комментарий ни о каком способе иметь дело с калибровкой.
Прежде всего Вы создали бы это управление как ContentControl. Этому нужно определить шаблон в generic.xaml, который имеет Ваши кнопочные управления плюс средство просмотра прокрутки. Что-то как:
<Canvas x:Name="root">
<Button x:Name="left" Content="<"/>
<Button x:Name="right" Content=">"/>
<ScrollViewer x:Name="viewer" BorderThickness="0" VerticalScrollBarVisibility="Hidden">
<ContentPresenter />
</ScrollViewer>
</Canvas>
Затем в Вашем управлении необходимо было бы переопределить OnApplyTemplate:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
left = GetTemplateChild("left") as Button;
left.Click += new RoutedEvent(YourHandler);
right = GetTemplateChild("right") as Button;
right.Click += new RoutedEvent(YourHandler);
// position your scroll buttons here, not writing that code
scroll = GetTemplateChild("viewer") as ScrollViewer;
root = GetTemplateChild("root") as Canvas;
var fe = this.Content as FrameworkElement;
if (fe != null)
{
fe.SizeChanged += new SizeChangedEventHandler(fe_SizeChanged);
}
}
void fe_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.InvalidateMeasure();
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!double.IsInfinity(scroll.ViewportHeight))
{
left.Visibility = (scroll.HorizontalOffset > 0);
right.Visibility = (scroll.HorizontalOffset < ScrollableHeight);
}
return base.ArrangeOverride(finalSize);
}
protected override Size MeasureOverride(Size availableSize)
{
scroll.Measure(availableSize);
return scroll.DesiredSize;
}
В Ваших обработчиках нажатий кнопки необходимо было бы (1) было бы прокрутить средство просмотра и (2) было бы проверить новое значение HorizontalOffset, чтобы видеть, необходимо ли скрыть или показать любую из кнопки.
Отказ от ответственности: Этот код, вероятно, не работает, как, так как он был записан вручную и на основе другого примера.