matplotlib绘制堆叠柱状图、多个柱形图

该博客分享了如何使用Matplotlib绘制电影票房数据,通过堆叠柱状图和多柱状图呈现三天内《千与千寻》、《玩具总动员4》和《黑衣人:全球追缉》的票房变化,直观展示了票房的动态走势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习期间做个笔记,如果有问题欢迎各位大佬指出~

#问题:
#三天中3部电影的票房变化,movie = ['千与千寻', '玩具总动员4', '黑衣人:全球追缉']
#real_day1 = [4053, 7548, 6543],real_day2 = [1840, 4013, 3421],real_day3 = [2080, 1673, 2342]
#按照以上数据,绘制同位置多柱状图,绘制堆叠图

#解答:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
movie=[1,2,3]
real_day1=np.array([4053,7548,6543])
real_day2=np.array([1840,4013,3421])
real_day3=np.array([2080,1673,2342])
#设置画布
fig = plt.figure(figsize=(4,5),dpi=150)
#用于显示中文
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
#绘制堆叠图
ax1 = fig.add_subplot(211)
width1=0.5
plt.bar(movie,real_day1,width=width1,color="silver")
plt.bar(movie,real_day2,width=width1,color="gold",bottom=real_day1)
plt.bar(movie,real_day3,width=width1,color="purple",bottom=real_day1+real_day2)
#修改x轴显示
plt.xticks(np.arange(1,4),('千与千寻','玩具总动员4','黑衣人:全球追缉'))

#绘制多柱形图
ax1 = fig.add_subplot(212)
width2=0.28
#设置x起始位置
day1_x=np.array([1,2,3])-width2
day2_x=day1_x+width2
day3_x=day1_x+2*width2
#绘图,label为设置图例做准备
plt.bar(day1_x,real_day1,width=width2,color='silver',label="第一天")
plt.bar(day2_x,real_day2,width=width2,color='gold',label='第二天')
plt.bar(day3_x,real_day3,width=width2,color='purple',label='第三天')
#修改x轴显示
plt.xticks(np.arange(1,4),('千与千寻','玩具总动员4','黑衣人:全球追缉'))
#设置y轴范围
plt.ylim(0,9000)
#设置图例
plt.legend(loc="upper left",fontsize=8)
#在坐标轴上加数值
for i in range(3):
    # 第一天
    plt.text(day1_x[i],real_day1[i],real_day1[i],fontsize=8,va="bottom",ha="center")
     # 第一天
    plt.text(day2_x[i],real_day2[i],real_day2[i],fontsize=8,va="bottom",ha="center")
     # 第一天
    plt.text(day3_x[i],real_day3[i],real_day3[i],fontsize=8,va="bottom",ha="center")
#tight保存图片完整
plt.savefig("test2",dpi=200,bbox_inches='tight')

结果图:

 

 

### 如何使用 Python Matplotlib 制作吸引人的柱状图 #### 使用 `matplotlib` 绘制基础柱状图 为了创建一个基本的柱状图,可以利用 `matplotlib.pyplot.bar()` 函数。此函数接受多个参数来定义条形的位置、高度和其他样式选项。 ```python import numpy as np import matplotlib.pyplot as plt categories = ['A', 'B', 'C'] values = [3, 7, 5] plt.figure(figsize=(8, 6)) plt.bar(categories, values, color='skyblue') plt.title('Basic Bar Chart Example') plt.xlabel('Categories') plt.ylabel('Values') for i in range(len(values)): plt.text(i, values[i] + 0.2, str(values[i]), ha='center') plt.show() ``` #### 创建簇状柱状图 当有两组或多组数据需要对比时,可以通过调整每组之间的位置偏移量来显示它们的关系。下面的例子展示了如何在同一图表上并排放置两个系列的数据。 ```python bar_width = 0.35 index = np.arange(len(categories)) series1_values = [4, 9, 2] series2_values = [3, 5, 7] fig, ax = plt.subplots(figsize=(8, 6)) rects1 = ax.bar(index - bar_width / 2, series1_values, bar_width, label='Series 1', alpha=0.7) rects2 = ax.bar(index + bar_width / 2, series2_values, bar_width, label='Series 2', alpha=0.7) ax.set_xlabel('Category') ax.set_ylabel('Scores') ax.set_title('Clustered Bar Chart of Two Series') ax.set_xticks(index) ax.set_xticklabels(categories) ax.legend() def add_labels(rects): """Attach a text label above each bar.""" for rect in rects: height = rect.get_height() ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3), # 3 points vertical offset textcoords="offset points", ha='center', va='bottom') add_labels(rects1) add_labels(rects2) plt.tight_layout() plt.show() ``` #### 构建三维百分比堆积柱形图 对于更复杂的情况,比如想要查看各部分占整体的比例关系,则可以选择构建三维百分比堆积柱形图。这不仅能够清晰表达比例信息,还能增加视觉吸引力[^3]. ```python from mpl_toolkits.mplot3d import Axes3D def percentage_stacked_bar_3d(dataframe, categories, groups, fig=None, ax=None): df_pct = dataframe.div(dataframe.sum(axis=1), axis=0).fillna(0)*100 bottom = None colors = plt.cm.viridis(np.linspace(0., 1., len(groups))) if not (isinstance(ax, Axes3D) and isinstance(fig, plt.Figure)): fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') width = depth = 0.5 for idx, col in enumerate(df_pct.columns): xs = list(range(len(categories))) ys = [df_pct.loc[row][col] for row in df_pct.index] if bottom is None: zs = [0]*len(xs) else: zs = bottom ax.bar3d(xs, zs, zs, width, depth, ys, shade=True, color=[colors[idx]]) if bottom is None: bottom = ys else: bottom = [sum(x) for x in zip(bottom, ys)] ax.set_zlabel('% Distribution') ax.set_yticks([]) ax.set_xticks(list(range(len(categories)))) ax.set_xticklabels(categories) ax.set_title('Percentage Stacked Bar Plot in 3D') ax.legend(labels=groups) data = {'Group A': [10, 20, 30], 'Group B': [20, 25, 15]} df = pd.DataFrame(data=data, index=['Cat1', 'Cat2', 'Cat3']) percentage_stacked_bar_3d(df, df.index.tolist(), data.keys()) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值