python+matplotlib实现礼盒柱状图实例代码


Posted in Python onJanuary 16, 2018

演示结果:

python+matplotlib实现礼盒柱状图实例代码

完整代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import BboxImage

from matplotlib._png import read_png
import matplotlib.colors
from matplotlib.cbook import get_sample_data


class RibbonBox(object):

  original_image = read_png(get_sample_data("Minduka_Present_Blue_Pack.png",
                       asfileobj=False))
  cut_location = 70
  b_and_h = original_image[:, :, 2]
  color = original_image[:, :, 2] - original_image[:, :, 0]
  alpha = original_image[:, :, 3]
  nx = original_image.shape[1]

  def __init__(self, color):
    rgb = matplotlib.colors.to_rgba(color)[:3]

    im = np.empty(self.original_image.shape,
           self.original_image.dtype)

    im[:, :, :3] = self.b_and_h[:, :, np.newaxis]
    im[:, :, :3] -= self.color[:, :, np.newaxis]*(1. - np.array(rgb))
    im[:, :, 3] = self.alpha

    self.im = im

  def get_stretched_image(self, stretch_factor):
    stretch_factor = max(stretch_factor, 1)
    ny, nx, nch = self.im.shape
    ny2 = int(ny*stretch_factor)

    stretched_image = np.empty((ny2, nx, nch),
                  self.im.dtype)
    cut = self.im[self.cut_location, :, :]
    stretched_image[:, :, :] = cut
    stretched_image[:self.cut_location, :, :] = \
      self.im[:self.cut_location, :, :]
    stretched_image[-(ny - self.cut_location):, :, :] = \
      self.im[-(ny - self.cut_location):, :, :]

    self._cached_im = stretched_image
    return stretched_image


class RibbonBoxImage(BboxImage):
  zorder = 1

  def __init__(self, bbox, color,
         cmap=None,
         norm=None,
         interpolation=None,
         origin=None,
         filternorm=1,
         filterrad=4.0,
         resample=False,
         **kwargs
         ):

    BboxImage.__init__(self, bbox,
              cmap=cmap,
              norm=norm,
              interpolation=interpolation,
              origin=origin,
              filternorm=filternorm,
              filterrad=filterrad,
              resample=resample,
              **kwargs
              )

    self._ribbonbox = RibbonBox(color)
    self._cached_ny = None

  def draw(self, renderer, *args, **kwargs):

    bbox = self.get_window_extent(renderer)
    stretch_factor = bbox.height / bbox.width

    ny = int(stretch_factor*self._ribbonbox.nx)
    if self._cached_ny != ny:
      arr = self._ribbonbox.get_stretched_image(stretch_factor)
      self.set_array(arr)
      self._cached_ny = ny

    BboxImage.draw(self, renderer, *args, **kwargs)


if 1:
  from matplotlib.transforms import Bbox, TransformedBbox
  from matplotlib.ticker import ScalarFormatter

  # Fixing random state for reproducibility
  np.random.seed(19680801)

  fig, ax = plt.subplots()

  years = np.arange(2004, 2009)
  box_colors = [(0.8, 0.2, 0.2),
         (0.2, 0.8, 0.2),
         (0.2, 0.2, 0.8),
         (0.7, 0.5, 0.8),
         (0.3, 0.8, 0.7),
         ]
  heights = np.random.random(years.shape) * 7000 + 3000

  fmt = ScalarFormatter(useOffset=False)
  ax.xaxis.set_major_formatter(fmt)

  for year, h, bc in zip(years, heights, box_colors):
    bbox0 = Bbox.from_extents(year - 0.4, 0., year + 0.4, h)
    bbox = TransformedBbox(bbox0, ax.transData)
    rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic")

    ax.add_artist(rb_patch)

    ax.annotate(r"%d" % (int(h/100.)*100),
          (year, h), va="bottom", ha="center")

  patch_gradient = BboxImage(ax.bbox,
                interpolation="bicubic",
                zorder=0.1,
                )
  gradient = np.zeros((2, 2, 4), dtype=float)
  gradient[:, :, :3] = [1, 1, 0.]
  gradient[:, :, 3] = [[0.1, 0.3], [0.3, 0.5]] # alpha channel
  patch_gradient.set_array(gradient)
  ax.add_artist(patch_gradient)

  ax.set_xlim(years[0] - 0.5, years[-1] + 0.5)
  ax.set_ylim(0, 10000)

  fig.savefig('ribbon_box.png')
  plt.show()

总结

以上就是本文关于python+matplotlib实现礼盒柱状图实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
用Python编程实现语音控制电脑
Apr 01 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python简单实现操作Mysql数据库
Jan 29 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
Python函数参数类型及排序原理总结
Dec 19 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
Python+matplotlib实现填充螺旋实例
Jan 15 #Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 #Python
wxPython之解决闪烁的问题
Jan 15 #Python
详细解读tornado协程(coroutine)原理
Jan 15 #Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 #Python
Tornado高并发处理方法实例代码
Jan 15 #Python
使用Python实现windows下的抓包与解析
Jan 15 #Python
You might like
大师制作的中短波矿石收音机
2020/04/02 无线电
php读取msn上的用户信息类
2008/12/05 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
详解Document.Cookie
2015/12/25 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
javascript中UMD规范的代码推演
2018/08/29 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
详解python单例模式与metaclass
2016/01/15 Python
Python中super函数的用法
2017/11/17 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
如何删除一个表里面的重复行
2013/07/13 面试题
优秀应届生推荐信
2013/11/09 职场文书
办理居住证介绍信
2014/01/15 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
成考报名单位证明范本
2014/01/16 职场文书
高校十八大报告感想
2014/01/27 职场文书
服务标兵事迹材料
2014/05/04 职场文书
局火灾防控工作方案
2014/05/25 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
经理助理岗位职责
2015/02/02 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle