Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1390|回复: 0

[默认分类] python使用matplotlib绘图 -- barChart

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-12 12:53:41 | 显示全部楼层 |阅读模式
            matplotlibpython最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。  -----引用自:http://hyry.dip.jp/pydoc/matplotlib_intro.html
            你可以从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib 下载安装matplotlib。
            这篇我们用matplotlib从构造最简单的bar一步一步向复杂的bar前行。什么是最简单的bar,看如下语句你就知道她有多么简单了:

    import matplotlib.pyplot as plt  



    plt.bar(left
    =
    0,height
    =
    1)

    plt.show()


      


    执行效果:





      


    是的,三句话就可以了,是我见过最简单的绘图语句。首先我们import了matplotlib.pyplot ,然后直接调用其bar方法,最后用show显示图像。我解释一下bar中的两个参数:


    left:柱形的左边缘的位置,如果我们指定1那么当前柱形的左边缘的x值就是1.0了
    height:这是柱形的高度,也就是Y轴的值了


    left,height除了可以使用单独的值(此时是一个柱形),也可以使用元组来替换(此时代表多个矩形)。例如,下面的例子:


      


    import matplotlib.pyplot as plt



    plt.bar(left
    = (
    0,
    1),height
    = (
    1,
    0.
    5))

    plt.show()
    1. [/code]
    2. [code][img]http://www.itdaan.com/imgs/1/8/9/4/54/b7f1ad7d03e1102f088790c8d3cb2bde.jpe[/img]
    复制代码


    1. [/code]
    2. 可以看到 left = (0,1)的意思就是总共有两个矩形,第一个的左边缘为0,第二个的左边缘为1。height参数同理。
    3.   
    4. 当然,可能你还觉得这两个矩形“太胖”了。此时我们可以通过指定bar的width参数来设置它们的宽度。
    5.   
    6. [b]import[/b] matplotlib.pyplot as plt
    7. plt.bar(left
    8. = (
    9. 0,
    10. 1),height
    11. = (
    12. 1,
    13. 0.
    14. 5),width
    15. =
    16. 0.
    17. 35)
    18. plt.show()
    19.   
    20. [img]http://www.itdaan.com/imgs/3/7/3/3/62/6ca304523e1a15ddd4b88ef412264769.jpe[/img]
    21.   
    22. 此时又来需求了,我需要标明x,y轴的说明。比如x轴是性别,y轴是人数。实现也很简单,看代码:
    23.   
    24.   [b]import[/b] matplotlib.pyplot as plt
    25.   
    26.   
    27. plt.xlabel(u
    28.   "性别")
    29.   
    30. plt.ylabel(u
    31.   "人数")
    32.   
    33. plt.bar(left
    34.   = (
    35.   0,
    36.   1),height
    37.   = (
    38.   1,
    39.   0.
    40.   5),width
    41.   =
    42.   0.
    43.   35)
    44.   
    45. plt.show()
    46.   
    47. [img]http://www.itdaan.com/imgs/5/3/0/1/50/934866ee7e6598884de9bf8cb42eeb39.jpe[/img]
    48.   
    49. 注意这里的中文一定要用u(3.0以上好像不用,我用的2.7),因为matplotlib只支持unicode。接下来,让我们在x轴上的每个bar进行说明。比如第一个是“男”,第二个是“女”。
    50.   
    51. [b]import[/b] matplotlib.pyplot as plt
    52. plt.xlabel(u
    53. "性别")
    54. plt.ylabel(u
    55. "人数")
    56. plt.xticks((
    57. 0,
    58. 1),(u
    59. "男",u
    60. "女"))
    61. plt.bar(left
    62. = (
    63. 0,
    64. 1),height
    65. = (
    66. 1,
    67. 0.
    68. 5),width
    69. =
    70. 0.
    71. 35)
    72. plt.show()
    73.   
    74. [img]http://www.itdaan.com/imgs/9/8/7/5/27/7b9d276524fd3713164a9d21777e1141.jpe[/img]
    75.   
    76. plt.xticks的用法和我们前面说到的left,height的用法差不多。如果你有几个bar,那么就是几维的元组。第一个是文字的位置,第二个是具体的文字说明。不过这里有个问题,很显然我们指定的位置有些“偏移”,最理想的状态应该在每个矩形的中间。你可以更改(0,1)=>( (0+0.35)/2 ,(1+0.35)/2 )不过这样比较麻烦。我们可以通过直接指定bar方法里面的align="center"就可以让文字居中了。
    77.   
    78.   [b]import[/b] matplotlib.pyplot as plt
    79.   
    80.   
    81. plt.xlabel(u
    82.   "性别")
    83.   
    84. plt.ylabel(u
    85.   "人数")
    86.   
    87.   
    88. plt.xticks((
    89.   0,
    90.   1),(u
    91.   "男",u
    92.   "女"))
    93.   
    94.   
    95. plt.bar(left
    96.   = (
    97.   0,
    98.   1),height
    99.   = (
    100.   1,
    101.   0.
    102.   5),width
    103.   =
    104.   0.
    105.   35,align
    106.   =
    107.   "center")
    108.   
    109.   
    110. plt.show()
    111.   
    112. [img]http://www.itdaan.com/imgs/3/9/8/6/68/946e1dfd20165b9511f1b5343dceb27d.jpe[/img]
    113.   
    114. 接下来,我们还可以给图标加入标题。
    115.   
    116.   plt.title(u
    117.   "性别比例分析")
    118.    
    119. [img]http://www.itdaan.com/imgs/1/5/6/2/68/29f731b4077780b47cba02695204fec4.jpe[/img]
    120.   
    121. 当然,还有图例也少不掉:
    122.   
    123. [b]import[/b] matplotlib.pyplot as plt
    124. plt.xlabel(u
    125. "性别")
    126. plt.ylabel(u
    127. "人数")
    128. plt.title(u
    129. "性别比例分析")
    130. plt.xticks((
    131. 0,
    132. 1),(u
    133. "男",u
    134. "女"))
    135. rect
    136. = plt.bar(left
    137. = (
    138. 0,
    139. 1),height
    140. = (
    141. 1,
    142. 0.
    143. 5),width
    144. =
    145. 0.
    146. 35,align
    147. =
    148. "center")
    149. plt.legend((rect,),(u
    150. "图例",))
    151. plt.show()
    152.   
    153. [img]http://www.itdaan.com/imgs/5/4/1/4/25/2f3cf5ea732cc27fa5f34c6de82478b6.jpe[/img]
    154.   
    155. [b]注意这里的legend方法,里面的参数必须是元组。即使你只有一个图例,不然显示不正确。[/b]
    156.   
    157. 接下来,我们还可以在每个矩形的上面标注它具体点Y值。这里,我们需要用到一个通用的方法:
    158.   
    159. [b]def[/b] autolabel(rects)
    160. :
    161.    
    162. [b]for[/b] rect
    163. [b]in[/b] rects
    164. :
    165.         height
    166. = rect.get_height()
    167.         plt.text(rect.get_x()
    168. +rect.get_width()
    169. /
    170. 2.,
    171. 1.
    172. 03
    173. *height,
    174. "%s"
    175. %
    176. [b]float[/b](height))
    177.   
    178. 其中plt.text的参数分别是:x坐标,y坐标,要显示的文字。所以,调用代码如下:
    179.   
    180. [b]import[/b] matplotlib.pyplot as plt
    181. [b]def[/b] autolabel(rects)
    182. :
    183.    
    184. [b]for[/b] rect
    185. [b]in[/b] rects
    186. :
    187.         height
    188. = rect.get_height()
    189.         plt.text(rect.get_x()
    190. +rect.get_width()
    191. /
    192. 2.,
    193. 1.
    194. 03
    195. *height,
    196. "%s"
    197. %
    198. [b]float[/b](height))
    199. plt.xlabel(u
    200. "性别")
    201. plt.ylabel(u
    202. "人数")
    203. plt.title(u
    204. "性别比例分析")
    205. plt.xticks((
    206. 0,
    207. 1),(u
    208. "男",u
    209. "女"))
    210. rect
    211. = plt.bar(left
    212. = (
    213. 0,
    214. 1),height
    215. = (
    216. 1,
    217. 0.
    218. 5),width
    219. =
    220. 0.
    221. 35,align
    222. =
    223. "center")
    224. plt.legend((rect,),(u
    225. "图例",))
    226. autolabel(rect)
    227. plt.show()
    228.   
    229. [img]http://www.itdaan.com/imgs/2/5/3/4/74/475ebc1da33edb61e5168b454d2e88a6.jpe[/img]
    230.   
    231. 到这里这个图形已经基本完备了,不过可以看到你一个矩形紧靠这顶部,不是很好看。最好能够空出一段距离出来就好了。这个设置我没有找到具体的属性。不过,我还是通过一个小技巧来实现了。就是bar属性的yerr参数。一旦设置了这个参数,那么对应的矩形上面就会有一个竖着的线,我不知道他是干什么的。不过当我把这个值设置的很小的时候,上面的空白就自动空出来了。如图:
    232.   
    233.   
    234. rect
    235.   = plt.bar(left
    236.   = (
    237.   0,
    238.   1),height
    239.   = (
    240.   1,
    241.   0.
    242.   5),width
    243.   =
    244.   0.
    245.   35,align
    246.   =
    247.   "center",yerr
    248.   =
    249.   0.
    250.   000001)
    251. [code]
    复制代码


    1. [/code]
    2. [code][img]http://www.itdaan.com/imgs/0/9/8/8/94/6bf4db78fb4ababbdf24a9c70f698c16.jpe[/img]
    复制代码


    [code][/code]


    对于左右两边能否空出空白来暂时还没有找到(xerr参数不行)




    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-19 16:27 , Processed in 0.334353 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表