使用pycha快速绘制办公常用图(饼图、垂直直方图、水平直方图、散点图等七种图形)

本文详细介绍了如何使用pycha模块轻松绘制饼图、直方图、线图等常见办公用图,提供了完整的代码示例和图表展示。

原文链接:http://blog.youkuaiyun.com/dyx1024/article/details/7300497

pychar下载地址已改为https://bitbucket.org/lgs/pycha/downloads

另需要cairo模块,下载地址为: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygtk

cairo说明:

在信息领域中,cairo 是一个让用于提供矢量图形绘图的免费库,cairo 提供在多个背景下做 2-D 的绘图,高级的更可以使用硬件加速功能。

虽然 cairo 是使用C语言撰写的,但是当使用 cairo 时,可以用许多其他种语言来使用,包括有C++C#JavaPythonPerlRubySchemeSmalltalk 以及许多种语言,cairo 在 GNU LGPL 与 Mozilla Public License (MPL) 两个认证下发布。


今天晚上学习了下使用pycha模块来制作各种办公用图的方法,非常简单,本文使用其绘制了7种图表。

   此模块和API地址为:http://www.lorenzogil.com/projects/pycha/,需要的朋友可以下载下来玩一下,下面是我晚上学习时写的一点东东,分享之。


一、代码:

[python]  view plain copy print ?
  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3.   
  4. import cairo   
  5. import pycha.pie  
  6. import pycha.bar  
  7. import pycha.scatter  
  8. import pycha.stackedbar  
  9. import pycha.line  
  10.   
  11. #设置画布  
  12. def set_charvalue():  
  13.     width,height=600,600   
  14.     surface=cairo.ImageSurface(cairo.FORMAT_ARGB32,width,height)   
  15.     return surface  
  16.       
  17. #画饼图  
  18. def draw_pie(surface, options, dataSet):  
  19.     chart=pycha.pie.PieChart(surface,options)   
  20.     chart.addDataset(dataSet)   
  21.     chart.render()   
  22.     surface.write_to_png('d:\\Pie.png')   
  23.   
  24. #垂直直方图  
  25. def draw_vertical_bar(surface, options, dataSet):  
  26.     chart=pycha.bar.VerticalBarChart(surface,options)   
  27.     chart.addDataset(dataSet)   
  28.     chart.render()   
  29.     surface.write_to_png('d:\\vertical_bar.png')     
  30.    
  31. #垂直水平直方图      
  32. def draw_horizontal_bar(surface, options, dataSet):  
  33.     chart = pycha.bar.HorizontalBarChart(surface,options)   
  34.     chart.addDataset(dataSet)   
  35.     chart.render()   
  36.     surface.write_to_png('d:\\horizontal_bar.png')     
  37.       
  38. #线图      
  39. def draw_line(surface, options, dataSet):  
  40.     chart = pycha.line.LineChart(surface,options)   
  41.     chart.addDataset(dataSet)   
  42.     chart.render()   
  43.     surface.write_to_png('d:\\line.png')        
  44.   
  45. #点图      
  46. def draw_scatterplot(surface, options, dataSet):  
  47.     chart = pycha.scatter.ScatterplotChart(surface,options)   
  48.     chart.addDataset(dataSet)   
  49.     chart.render()   
  50.     surface.write_to_png('d:\\scatterplotChart.png')           
  51.   
  52. #垂直块图       
  53. def draw_stackedverticalbarChar(surface, options, dataSet):  
  54.     chart = pycha.stackedbar.StackedVerticalBarChart(surface,options)   
  55.     chart.addDataset(dataSet)   
  56.     chart.render()   
  57.     surface.write_to_png('d:\\stackedVerticalBarChart.png')        
  58.   
  59. #水平块图  
  60. def draw_stackedhorizontalbarChart(surface, options, dataSet):  
  61.     chart = pycha.stackedbar.StackedHorizontalBarChart(surface,options)   
  62.     chart.addDataset(dataSet)   
  63.     chart.render()   
  64.     surface.write_to_png('d:\\stackedhorizontalbarChart.png')      
  65.       
  66. if __name__ == '__main__':  
  67.     ''''' 
  68.     Function:使用pycha画各种图表 
  69.     Input:NONE 
  70.     Output: NONE 
  71.     author: socrates 
  72.     blog:http://blog.youkuaiyun.com/dyx1024 
  73.     date:2012-02-28 
  74.     '''  
  75.     #数据来源  
  76.     dataSet=(   
  77.              ('iphone',((0,1),(1,3),(2,2.5))),   
  78.              ('htc',((0,2),(1,4),(2,3))),   
  79.              ('hw',((0,5),(1,1,),(2,0.5))),   
  80.              ('zte',((0,3),(1,2,),(2,1.5))),   
  81.             )   
  82.       
  83.     #图像属性定义  
  84.     options={   
  85.                 'legend':{'hide':False},   
  86.                 'title':'手机销售量分布图(by dyx1024)',  
  87.                 'titleColor':'#0000ff',  
  88.                 'titleFont':'字体',  
  89.                 'background':{'chartColor''#ffffff'},   
  90.                 'axis':{'labelColor':'#ff0000'},  
  91.             }       
  92.       
  93.       
  94.     surface = set_charvalue()  
  95.       
  96.     #根据需要调用不同函数画不同形状的图  
  97.     #draw_pie(surface, options, dataSet)  
  98.     #draw_vertical_bar(surface, options, dataSet)  
  99.     #draw_horizontal_bar(surface, options, dataSet)  
  100.     #draw_scatterplot(surface, options, dataSet)  
  101.     #draw_stackedverticalbarChar(surface, options, dataSet)  
  102.     #draw_stackedhorizontalbarChart(surface, options, dataSet)  
  103.     draw_line(surface, options, dataSet)  
  104.       
  105.           

<think> 在PyCharm中使用Matplotlib绘制直方图时,调整直方图的宽度可以通过设置`plt.bar()`或`plt.hist()`函数的参数来实现。具体方法取决于你使用的是条形(bar)还是直方图(hist)。这里我们主要讨论两种情况: 1. **使用`plt.bar()`绘制条形(类似于直方图)**:此时可以通过`width`参数直接控制每个条形的宽度。 2. **使用`plt.hist()`绘制直方图**:此时可以通过`rwidth`参数(相对宽度)来控制条形的宽度。 ### 方法1:使用`plt.bar()`调整宽度(推荐用于类别数据) 如果你已经将数据分好类(即每个条形代表一个类别),那么使用`plt.bar()`更为合适,因为你可以直接设置每个条形的宽度。 ```python import matplotlib.pyplot as plt data = [82, 76, 24, 40, 67, 62, 75, 78, 71, 32] categories = range(len(data)) # 设置条形宽度,例如0.5(默认是0.8) bar_width = 0.5 plt.bar(categories, data, width=bar_width) plt.title('调整宽度的直方图(条形)') plt.xlabel('类别') plt.ylabel('数值') plt.show() ``` **参数说明**: - `width`: 条形的宽度(以X轴单位计)。默认值为0.8。减小这个值会使条形变窄,增大则变宽。 ### 方法2:使用`plt.hist()`调整宽度(用于连续数据的分箱) 如果你正在绘制连续数据的频率分布(即直方图),则使用`plt.hist()`,并通过`rwidth`参数控制宽度。 ```python import matplotlib.pyplot as plt import numpy as np # 生成连续数据 data = np.random.randn(1000) # 设置直方图的相对宽度(0到1之间),默认是1 relative_width = 0.8 plt.hist(data, bins=30, rwidth=relative_width) plt.title('调整宽度的直方图') plt.xlabel('值') plt.ylabel('频率') plt.show() ``` **参数说明**: - `rwidth`: 条形的相对宽度(相对于分箱宽度的比例)。例如,如果分箱宽度是2,`rwidth=0.8`则条形宽度为1.6。设置为0.8意味着条形之间会有空隙。 ### 注意事项: 1. **`plt.bar()` vs `plt.hist()`**: - `plt.bar()`用于绘制类别数据的条形(每个条形代表一个类别)。 - `plt.hist()`用于绘制连续数据的频率分布(自动分箱)。 2. **PyCharm中的显示**:确保在PyCharm中正确配置了Matplotlib的后端(通常会自动使用交互式后端)。如果表没有显示,可以检查是否调用了`plt.show()`。 3. **宽度值的选择**: - 在`plt.bar()`中,`width`的值应小于1(特别是当类别较多时)以避免条形重叠。 - 在`plt.hist()`中,`rwidth`的值在0到1之间,设置为1表示条形之间没有空隙。 ### 示例:在同一个绘制多个直方图(调整宽度避免重叠) 当需要比较多个分布时,可能需要调整宽度以避免重叠: ```python import matplotlib.pyplot as plt import numpy as np data1 = np.random.normal(0, 1, 1000) data2 = np.random.normal(3, 1, 1000) # 设置分箱 bins = np.linspace(-5, 5, 30) # 绘制两个直方图,并调整宽度 plt.hist(data1, bins=bins, alpha=0.5, rwidth=0.8, label='Data 1') plt.hist(data2, bins=bins, alpha=0.5, rwidth=0.8, label='Data 2') plt.legend() plt.title('两个分布的直方图') plt.show() ``` 在这个例子中,`rwidth=0.8`使得每个条形宽度为分箱宽度的80%,这样两个直方图并置时不会完全重叠,同时通过`alpha`(透明度)参数使重叠部分可见。 --- §§相关问题§§: 1. 如何在Matplotlib中调整直方图的边缘颜色? 2. 如何设置直方图的透明度(alpha)? 3. 在绘制多个直方图时,如何避免重叠? 4. 如何使用`plt.bar()`绘制水平条形? </think> 在 PyCharm 中使用 Matplotlib 绘制直方图时,调整直方图宽度的方法取决于你使用的是 `plt.hist()`(用于数值分布)还是 `plt.bar()`(用于分类数据)。以下是详细的解决方案: ### 解决方案:调整直方图宽度 #### 情况1:使用 `plt.hist()` 绘制数值分布直方图 当处理连续数值数据时,通常使用 `plt.hist()`。调整宽度需要使用 `rwidth` 参数: ```python import matplotlib.pyplot as plt import numpy as np # 生成示例数据 data = np.random.normal(170, 10, 250) # 平均身高170cm,标准差10 # 绘制直方图并调整宽度 (rwidth 范围: 0.0-1.0) plt.hist(data, bins=20, rwidth=0.7, color='skyblue', edgecolor='black') plt.title('身高分布 (rwidth=0.7)') plt.xlabel('身高 (cm)') plt.ylabel('频数') plt.show() ``` **关键参数说明**: - `rwidth`: 条形的相对宽度(默认1.0),取值范围0.0-1.0 - `bins`: 分箱数量,影响条的粗细(更多分箱 → 更细的条) - `edgecolor`: 条形边框颜色,使相邻条形更易区分 #### 情况2:使用 `plt.bar()` 绘制分类数据直方图 当处理分类数据时,使用 `plt.bar()` 并直接设置 `width` 参数: ```python import matplotlib.pyplot as plt # 分类数据示例 categories = ['A', 'B', 'C', 'D'] values = [23, 45, 56, 78] # 绘制直方图并指定宽度 (width 范围基于X轴刻度) plt.bar(categories, values, width=0.5, color='salmon', edgecolor='black') plt.title('分类数据直方图 (width=0.5)') plt.xlabel('类别') plt.ylabel('数值') plt.show() ``` **关键参数说明**: - `width`: 条形的绝对宽度(默认0.8),以X轴单位计 - 当X轴是分类数据时,宽度值通常设置在0.1-1.0之间 ### 高级技巧:动态调整宽度 #### 方法1:根据数据范围自动调整 ```python import matplotlib.pyplot as plt import numpy as np data = np.random.randn(1000) # 自动计算合适的宽度 bin_width = 0.5 # 自定义宽度因子 bins = np.arange(min(data), max(data) + bin_width, bin_width) plt.hist(data, bins=bins, rwidth=0.8) plt.title('动态宽度直方图') plt.show() ``` #### 方法2:分组直方图的宽度控制 ```python import numpy as np import matplotlib.pyplot as plt # 分组数据 data1 = np.random.normal(0, 1, 1000) data2 = np.random.normal(3, 1, 1000) plt.hist(data1, bins=30, alpha=0.5, rwidth=0.8, label='组1') plt.hist(data2, bins=30, alpha=0.5, rwidth=0.8, label='组2') plt.title('分组直方图') plt.legend() plt.show() ``` ### 注意事项: 1. **宽度类型区别**: - `plt.hist()` 使用相对宽度 `rwidth` (0.0-1.0) - `plt.bar()` 使用绝对宽度 `width` (基于X轴刻度) 2. **避免重叠**: - 当宽度设置过大时条形会重叠 - 解决方法:减小宽度或增加直方图间距 3. **PyCharm 显示优化**: ```python plt.figure(figsize=(10, 6)) # 调整整个图形大小 plt.tight_layout() # 自动调整子参数 ``` 4. **宽度与分箱关系**: 更多分箱(bins) → 更细的条形 更少分箱 → 更宽的条形 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值