为什么vsdebug没有生成obj文件_reportlab生成的图表总汇

这篇博客介绍了如何使用reportlab库生成包括直方图、折线图、饼形图、雷达图、散点图和分区图等多种图表,并提供了官方示例的中文注释。runall.py脚本用于运行各图表的生成程序,输出不同格式的图表文件。
摘要由CSDN通过智能技术生成

在reportlab的官方网站(https://www.reportlab.com/chartgallery/pie/)上给出生成各种图表的例子,对于我这种不经常跟图表打交道的人来说还是挺开眼界的,我们拿出几个做中文注释。在即将推出的reportlab的教学视频里会详细介绍每个程序,先来看都生成了哪些图表。

直方图(Bar Chart):

9ce6cd3b03e4cd24e83919c42fb05a77.png

79c0de97f40eccf78c91f44a3b611521.png

02edf766e0e9fa2b84b07ca67f052101.png

76ce31afd7e645dd717a6726489043a0.png

68c6b132eee75ef5579fd909c9925a02.png

7f7f259b2004ad298bf523c04a7a9f2d.png

8aa9509ec7683e1df45e9568a793ed20.png

7634ba3b3e7828a3c7984de172a81903.png

c09f12d3659c0653fa299b38fd7a5119.png

9b840d4e54876c0269634133a7353623.png

41b11135427344c086252146ee6e33bc.png

折线图(Line Plot):

9c38900358c4a4e8fb6e0b7b293d1265.png

efab25637b2db89ace3257380993b0a4.png

ce81b7382d8d838c4d1a81f75d2008dd.png

2c322c92c9ec909af2c3177a57f34c2c.png

2686f7aab15efd04ab0985816b42da6c.png

c9fb81de40a87880916002ee41379f10.png

饼形图(Pie Chart):

f0a0527b6b920971072554ddda09829d.png

c31c1f45e4488085935c1af0c68647e9.png

c6d86dde15e9c32f556ec10b9912e339.png

2f672014836012b0b8e5af66a446755f.png

8d44dcd13f015fff674e647000e9086e.png

b295ea881bf1eb11e5ea1b95a3bed7b3.png

雷达图(Radar Chart或蛛网图Spider Chart):

e7c225661ba42b0054d0a4763bb7cefa.png

6e8525ba2837962d3b794519082df451.png

散点图(Scatter Plot):

bde52e6273f59bc26632b1f24fb25d84.png

780477eb38ad4774ca9e72bf586048ef.png

58c43f0b9891992886e552e265584ecf.png

893c5c3ad2a880883a0baa48b3277788.png

a54635019dc7b2d016c3aa1c6ec582f4.png

分区图(Area Chart):

46db44db6f1d6063d3044b0ccced8f50.png

5d484268fd625a7b6f7c310d25ffcd95.png

生成每个图表的程序都放在独立的代码文件里,用自定义的类来完成,程序runall.py把当前文件夹下的所有生成图表的.py的程序逐个运行,生成指定类型的图表文件(可以是pdf、pict或png)。runall.py和注释如下:

# 运行代码所在目录下所有的生成图表的py程序import sysimport glob     # 查找符合特定规则的文件路径名import inspect  # 可以获取类和对象的参数信息def moduleClasses(mod):    # moduleClasses的mod参数是引进的模块    def P(obj, m=mod.__name__, CT=type):        return (type(obj)==CT and obj.__module__==m)        # mod.__name__得到的模块名,比如'2-2lineChart_withMarkers'        # 这里为了讲课方便,模块的名称用数字序号开头标识顺序        # 直接在程序中用import 2-2lineChart_withMarkers是会报错的        # 但动态引入就可以,比如__import__('2-2lineChart_withMarkers')        # obj是模块里包括引用模块的类成员        # 比如2-2lineChart_withMarkers.py里定义的LineChart_WithMarkers        # 也可能是引用的模块里的成员,比如PCMYKColor(0,0,0,24,alpha=100)        # obj.__module__得到obj所在的模块名        # obj.__module__== m,m是mod.__name__,mod是调用函数给的模块        # 所以这个判断条件确保只提取给出模块的类成员        # type(obj)是obj的类型,如果是在module直接定义的类,类型是type    try:        return inspect.getmembers(mod, P)[0][1]        # inspect.getmembers()检查第一个参数mod(module的前三个字母)的成员和值,        # 这里的mod是个模块        # 如果有第二个参数P(函数名),则只返回P为真的成员和值        # inspect.getmembers(mod, P))返回:        # [('ClusteredBar', )]    except:        return Nonedef getclass(f):    return moduleClasses(__import__(f))    # import导入Python模块时,调用的是__import__()函数,只有动态加载模块时才直接使用该函数    # __import__(f)引入f, 如__import__('2-2lineChart_withMarkers')    # 将2-2lineChart_withMarkers.py的内容引入    # __import__(f)返回引进模块,比如    # 调用函数moduleClasses(引入的模块),moduleClasses()函数可以把模块里定义的类取出来    # 所以函数getclass()的返回值是模块里定义的类def run(format, VERBOSE=0):# format接收声称文件的类型,比如pdf,png……# VERBOSE是冗长、啰嗦,默认为0;如果调用run()时指定为1,则会输出文件的类型    formats = format.split(',')    # 假如接收到的format是' PDF, png',则format被用','分开后得到的formats为[' PDF', 'png']    for i in range(0, len(formats)):        formats[i] == formats[i].strip().lower()        # 剥掉列表formats的每个字符串元素左右的空格,并变成小写,formats变成['pdf', 'png']    allfiles = glob.glob('*.py')    # glob.glob('*.py')将当前文件夹下的py文件名字符串取出来,放进allfiles    # 比如allfiles的内容可能为['2-2lineChart_withMarkers.py', '5-1areaChart_withDynamicLabel.py', ……]    allfiles.sort()    # 对列表allfiles的元素进行排序    for fn in allfiles:     # 进入循环一个一个文件处理        f = fn.split('.')[0]        # fn.split('.')把文件名与扩展名分开,比如['2-2lineChart_withMarkers', 'py']        # 索引为0取出文件名放入变量f,即'2-2lineChart_withMarkers'        c = getclass(f)        # 调用自己定义的函数getclass('2-2lineChart_withMarkers')        # 引进名字为f的模块或类,跟在程序首部把f引进(import)一个效果        # 返回名字为f的类或模块,比如        if c != None:       # 如果fn里确实有定义的类和模块,则存放返回值的变量c就不为None            print(c.__name__)   # 显示fn里定义的类名称,比如LineChart_WithMarkers            try:                for fmt in formats:                # 理论上formats是存放着文件格式字串的列表,比如[' PDF', 'png']                    if fmt:     # 如果列表元素不为空                        c().save(formats=[fmt],outDir='.',fnRoot=c.__name__)                        # c是引入的fn里定义的一个类,c()是类c生成的一个对象                        # 调用c类对象的方法函数save()将对象内容生成指定格式的文件                        # formats=格式参数,outDir=区分名字和扩展名的符号,fnRoot=文件名                        if VERBOSE:     # 如果调用函数时给的VERBOSE为1                            print("  %s.%s" % (c.__name__, fmt))                            # 则输出文件名及格式            except:                print("  COULDN'T CREATE '%s.%s'!" % (c.__name__, format))                # 出错输出提示无法生成该格式的文件,继续处理下一个if __name__ == "__main__":    if len(sys.argv) == 1:    # 以下情况if语句的条件为真:    #   1、在pycharm(或其他集成开发环境)    #   2、在终端/命令窗口进入runall.py所在目录,敲入:python3 runall.py        run('pdf,pict,png')        # 依次声称PDF、PICT和PNG文件类型的图表    else:        try:            if sys.argv[1] == "-h":            # if语句条件为真的情况:            #   在命令行或终端进入runall.py所在目录,运行: python3 runall.py -h            # sys.argv[0]为'runall.py',sys.argv[1]为'-h'                print('usage: runall.py [FORMAT] [-h]')                print('   if format is supplied is should be one or more of pdf,gif,eps,png etc')                print('   if format is missing the following formats are assumed: pdf,pict,png')                print('   -h prints this message')            else:                t = sys.argv[1:]                # 比如命令:python3 runall.py PDF PNG,sys.argv[1]为'PDF'                # sys.argv[2]为'PNG',t的值为['PDF', 'PNG']                for f in t:                    run(f)                # 进入循环,依次运行run('PDF')和run('PNG'),指定生成的文件类型        except:     # 给出出错提示,输出跟python3 runall.py -h一样            print('usage: runall.py [FORMAT][-h]')            print('   if format is supplied is should be one or more of pdf,gif,eps,png etc')            print('   if format is missing the following formats are assumed: pdf,pict,png')            print('   -h prints this message')            raise

后面的帖子会给出一系列图表的程序和中文注释,敬请关注。

c2d10ff827142fcef2de68ba34d1e42b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值