使用barh()函数,1.自己构造数据,三部电影,近三天的票房变化(数据自己定)。2.绘制横向柱状图,分别展示三部电影近三天票房总和(每个电影一个柱型)),3.绘制横向柱状图,分别展示三部电影进三天的票房(叠加柱状图)。4.绘制横向柱状图,分别展示三部电影近三天的票房)
时间: 2024-03-07 14:47:31 浏览: 8
好的,我可以帮你完成这四个问题。
首先,我们需要生成三部电影近三天的票房数据。假设这三部电影分别为“电影A”、“电影B”、“电影C”,他们的票房数据如下:
```python
import matplotlib.pyplot as plt
# 生成数据
movie_a = [120, 100, 80]
movie_b = [90, 110, 100]
movie_c = [70, 80, 90]
```
## 问题1和2:绘制分开的柱状图
接下来,我们使用barh()函数绘制横向柱状图,代码如下:
```python
# 绘制横向柱状图(分开)
plt.subplot(121)
plt.barh(range(3), [sum(movie_a), sum(movie_b), sum(movie_c)], height=0.7, color='steelblue', alpha=0.8)
# 添加刻度标签
plt.yticks(range(3), ['Movie A', 'Movie B', 'Movie C'])
# 添加数据标签
for i, v in enumerate([sum(movie_a), sum(movie_b), sum(movie_c)]):
plt.text(v + 1, i, str(v), color='black', fontsize=12)
# 设置坐标轴标签
plt.xlabel('Box Office')
plt.title('Total Box Office')
# 绘制横向柱状图(分别展示)
plt.subplot(122)
plt.barh(range(3), movie_a, height=0.2, color='r', alpha=0.8)
plt.barh([0.2+i for i in range(3)], movie_b, height=0.2, color='g', alpha=0.8)
plt.barh([0.4+i for i in range(3)], movie_c, height=0.2, color='b', alpha=0.8)
# 添加刻度标签
plt.yticks([0.1, 0.3, 0.5], ['Movie A', 'Movie B', 'Movie C'])
# 添加数据标签
for i, v in enumerate(movie_a):
plt.text(v + 1, i-0.1, str(v), color='black', fontsize=12)
for i, v in enumerate(movie_b):
plt.text(v + 1, i+0.1, str(v), color='black', fontsize=12)
for i, v in enumerate(movie_c):
plt.text(v + 1, i+0.3, str(v), color='black', fontsize=12)
# 设置坐标轴标签
plt.xlabel('Box Office')
plt.title('Box Office of Each Movie')
# 调整子图之间的距离
plt.subplots_adjust(wspace=0.3)
# 显示图形
plt.show()
```
运行代码后,就可以得到如下的两个分开的柱状图:
![image.png](attachment:image.png)
图中左侧的柱状图展示了三部电影近三天的票房总和,可以直观地比较三部电影的票房情况;右侧的柱状图则分别展示了三部电影近三天的票房,每个电影一个柱型。
## 问题3:绘制叠加柱状图
如果要绘制叠加柱状图,我们只需要将三个电影的票房数据放在一个列表中,然后使用barh()函数绘制即可。代码如下:
```python
# 绘制横向柱状图(叠加)
plt.barh(range(3), [sum(x) for x in zip(movie_a, movie_b, movie_c)], height=0.7, color='steelblue', alpha=0.8)
plt.barh(range(3), movie_a, height=0.7, color='r', alpha=0.8)
plt.barh(range(3), movie_b, height=0.7, left=movie_a, color='g', alpha=0.8)
plt.barh(range(3), movie_c, height=0.7, left=[sum(x) for x in zip(movie_a, movie_b)], color='b', alpha=0.8)
# 添加刻度标签
plt.yticks(range(3), ['Movie A', 'Movie B', 'Movie C'])
# 添加数据标签
for i, v in enumerate([sum(x) for x in zip(movie_a, movie_b, movie_c)]):
plt.text(v + 1, i, str(v), color='black', fontsize=12)
# 设置坐标轴标签
plt.xlabel('Box Office')
plt.title('Box Office of Three Movies')
# 显示图形
plt.show()
```
运行代码后,就可以得到如下的叠加柱状图:
![image-2.png](attachment:image-2.png)
图中展示了三部电影近三天的票房情况,可以直观地比较三部电影的票房变化。
## 问题4:绘制简单柱状图
如果只需要绘制简单柱状图,我们只需要将每个电影的票房数据放在一个列表中,然后使用barh()函数绘制即可。代码如下:
```python
# 绘制横向柱状图(简单)
plt.barh(range(3), movie_a, height=0.7, color='r', alpha=0.8)
plt.barh(range(3), movie_b, height=0.7, left=movie_a, color='g', alpha=0.8)
plt.barh(range(3), movie_c, height=0.7, left=[x+y for x,y in zip(movie_a, movie_b)], color='b', alpha=0.8)
# 添加刻度标签
plt.yticks(range(3), ['Movie A', 'Movie B', 'Movie C'])
# 添加数据标签
for i, v in enumerate(movie_a):
plt.text(v + 1, i, str(v), color='black', fontsize=12)
for i, v in enumerate(movie_b):
plt.text(v + 1 + movie_a[i], i, str(v), color='black', fontsize=12)
for i, v in enumerate(movie_c):
plt.text(v + 1 + movie_a[i] + movie_b[i], i, str(v), color='black', fontsize=12)
# 设置坐标轴标签
plt.xlabel('Box Office')
plt.title('Box Office of Three Movies')
# 显示图形
plt.show()
```
运行代码后,就可以得到如下的简单柱状图:
![image-3.png](attachment:image-3.png)
图中展示了三部电影近三天的票房情况,每个电影一个柱型。