5.3 图表绘制 : 作图模板的使用与扩展 : 以多线图为例

# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
from IPython.display import Image
import matplotlib.pyplot as plt

目标图表形式

Image('./source/multi_line.png')
data = pd.DataFrame(
np.array([[1, 3, 2, 4, 6],
       [1, 3, 2, 5, 6],
       [1, 2, 3, 5, 6],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5]]),
columns = ['B00B8CG602', 'B0009X29WK', 'B00MW8G62E', 'B01N9KSITZ', 'B000W5SLB8'],
index = ['2018-05-21', '2018-05-22', '2018-05-23', '2018-05-24', 
         '2018-05-25', '2018-05-26', '2018-05-27']
)

继承模板

观察多线图和上一章中柱形图的差异,可以发现以下结构有不同:

  • 画图方式
  • Tick显示
  • Legend在下侧
  • y轴的 Major tick 和 Major tick label在右侧,且顺序为逆

所以在这些部分我们需要进行相关的自定义

%run Images.py

# 使用generator : cycle, 循环迭代
from itertools import cycle
class ImageMultiLine(Image):
    # 定义不同线的颜色选择
    color_cycle = cycle(['blue', 'orange', 'red', 'lightyellow', 'royalblue'])

    def plot(self):
        # 定义多线图中线的形状
        self.marker_style = []
        for asin in self.y.columns:
            data = self.y[asin]
            marker_style = dict(color=self.default_colors[next(self.color_cycle)], 
                                linestyle='-', marker='o')
            self.marker_style.append(marker_style)
            self.ax.plot(self.x, data, zorder=3, label=asin, **marker_style)
            
    # 设置y轴标签    
    def set_yticks(self):
        self.ax.yaxis.tick_right()

    def set_tick_marks(self):
        self.ax.tick_params(axis='both', zorder=1, which='both', bottom=True, top=False, 
                labelbottom=True, left=False, right=False, labelleft=True)

        
    # 设置Legend
    def add_legend(self):
        handles, labels = self.ax.get_legend_handles_labels()
        self.ax.legend(handles, labels, loc='lower center', ncol=3, bbox_to_anchor=(0.5, -0.4), prop=self.legend_font, frameon=False)
        
    def config_add(self):
        self.set_yticks()
        # tick_marks 需要在设置yticks后再次设置,因为set_yticks会重新生成ticks,之前所做的设置就无效了
        self.set_tick_marks()
        data_max = self.y.max().max()
        # 设置y轴上限,为图表显示留出空间
        if round(data_max*1.1)-round(data_max)>1:
            top = round(data_max*1.1)
        else:
            top = round(data_max)+1
        self.ax.set_ylim(top=top)
image = ImageMultiLine(data=data,
               labels=data.index,
               title='商品排名变化情况',
               xticks_rotation=0,
               title_y = 1.1
              )
image.init()
if image.intervals<1:
    image.intervals = 1
image.init()
image.ax.invert_yaxis()
image.fig
image.ax.tick_params(axis='both', which='both', bottom=True, top=False, 
        labelbottom=True, left=False, right=False, labelleft=True)
image.fig

作业1:做出下图

Tip : 绘图方法为fill_between

数据

data = range(9)
%run Images.py
class ImageFill(Image):
    def plot(self):
        self.ax.fill_between(self.x, min(self.y)*0.9, 
                self.y, zorder=3, color=self.default_colors['blue'])   
        
    def set_spines(self):
        self.ax.spines['right'].set_visible(False)
        self.ax.spines['top'].set_visible(False)
        self.ax.spines['bottom'].set_visible(False)
        self.ax.spines['left'].set_visible(False)
image = ImageFill(data = data, 
                 labels = data,
                 title = 'Fill Image',
                 legend_name = ['Legend'])

image.init()
image.fig
a = None
if a is not None:
    print('hh')

作业2: 增强模板的鲁棒性

模板还有很多缺陷,比如title为空,legend为空,labels为空等,都会出现错误,请加入在不同输入时的提醒和处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358