How to create a stacked bar plot from a wide dataframe(如何从宽数据帧创建堆叠条形图)
                            本文介绍了如何从宽数据帧创建堆叠条形图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
                        
                        问题描述
您能帮我找出这个代码有什么问题吗?我收到相同的错误消息&&ufunc‘add’不包含具有签名匹配类型的循环(dtype(‘<;U32’)、dtype(‘<;U32’))->;dtype(‘<;U32’)&qot;
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
data = {'Information Technology' : [217.88,  581.07,  247.28,  200.17], 'Industrials' : [142.33,  324.59,  159.60,  163.68], 'Health Care' : [126.63,  258.50,  135.77,  134.90], 'Communication' : [142.33,  324.59,  159.60,  163.68], 'Financials' : [212.54,  330.87,  165.56,  203.98], 'Consumer Staples' : [561.36,  390.29,  117.85,   93.67], 'Seniority' : [1.0, 2.0, 3.0, 4.0]}
frame = pd.DataFrame(data)
   Information Technology  Industrials  Health Care  Communication  Financials  Consumer Staples  Seniority
0                  217.88       142.33       126.63         142.33      212.54            561.36        1.0
1                  581.07       324.59       258.50         324.59      330.87            390.29        2.0
2                  247.28       159.60       135.77         159.60      165.56            117.85        3.0
3                  200.17       163.68       134.90         163.68      203.98             93.67        4.0
frame.set_index('Seniority')
legend = ['Information Technology','Industrials','Health Care', 'Communication','Financials', 'Consumer Staples']
Information_Technology = frame.iloc[:,0]
Industrials = frame.iloc[:,1]
Health_Care = frame.iloc[:,2]
Communication = frame.iloc[:,3]
Financials = frame.iloc[:,4]
Consumer_Staples = frame.iloc[:,5]
Seniority = frame.iloc[:,6]
graphInformationTechnology = plt.bar(Seniority, Information_Technology ,0.35 ,color = '#FF0000' ,label = "Information Technology") 
graphIndustrials = plt.bar(Seniority, Industrials, 0.35 , bottom = Information_Technology ,color = '#ffff00' ,label ="Industrials")
graphHealthCare = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care ,color = '#0000FF' ,label ="Health Care")
graphCommunication = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Industrials ,color = '#0000FF' ,label ="Communication")
graphFinancials = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Industrials + Financials ,color = '#0000FF' ,label ="Financials")
graphconsumerstaples = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Financials + Financials + 'consumer staples' ,color = '#0000FF' ,label ="Consumer Staples")
for ticklabel in plt.gca().get_xticklabels():
    ticklabel.set_color('#CC3300') 
for ticklabel in plt.gca().get_yticklabels():
    ticklabel.set_color('#9932CC') 
plt.xlabel('Seniority')
plt.ylabel('Job Count')
plt.legend(legend , loc=(1.0,0)) 
plt.title('Seniority and Job Count', size=20, fontweight="bold")
plt.show()
错误
---------------------------------------------------------------------------
UFuncTypeError                            Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_22704/1999813345.py in <module>
     19 graphCommunication = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Industrials ,color = '#0000FF' ,label ="Communication")
     20 graphFinancials = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Industrials + Financials ,color = '#0000FF' ,label ="Financials")
---> 21 graphconsumerstaples = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Health_Care + Financials + Financials + 'consumer staples' ,color = '#0000FF' ,label ="Consumer Staples")
     22 
     23 
D:anaconda3envspy39libsite-packagespandascoreopscommon.py in new_method(self, other)
     67         other = item_from_zerodim(other)
     68 
---> 69         return method(self, other)
     70 
     71     return new_method
D:anaconda3envspy39libsite-packagespandascorearraylike.py in __add__(self, other)
     90     @unpack_zerodim_and_defer("__add__")
     91     def __add__(self, other):
---> 92         return self._arith_method(other, operator.add)
     93 
     94     @unpack_zerodim_and_defer("__radd__")
D:anaconda3envspy39libsite-packagespandascoreseries.py in _arith_method(self, other, op)
   5524 
   5525         with np.errstate(all="ignore"):
-> 5526             result = ops.arithmetic_op(lvalues, rvalues, op)
   5527 
   5528         return self._construct_result(result, name=res_name)
D:anaconda3envspy39libsite-packagespandascoreopsarray_ops.py in arithmetic_op(left, right, op)
    222         _bool_arith_check(op, left, right)
    223 
--> 224         res_values = _na_arithmetic_op(left, right, op)
    225 
    226     return res_values
D:anaconda3envspy39libsite-packagespandascoreopsarray_ops.py in _na_arithmetic_op(left, right, op, is_cmp)
    164 
    165     try:
--> 166         result = func(left, right)
    167     except TypeError:
    168         if is_object_dtype(left) or is_object_dtype(right) and not is_cmp:
UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types (dtype('float64'), dtype('<U16')) -> None
推荐答案
pandas 堆叠条形图-正确方式
- 将
pandas.DataFrame.plot与kind='bar'和stacked=True一起使用 - 这将实现从26行代码减少到9行
 - 对于自定义颜色,请为每个部分指定颜色列表,并在
ax = frame.plot(..., color=color)内部添加color=color。color = ['red', 'yellow', 'blue', 'orange', 'green', 'purple']
 - 测试于
python 3.8.12、pandas 1.3.4、matplotlib 3.4.3 
import pandas as pd
import matplotlib.pyplot as plt
# create the DataFrame using data from the OP
frame = pd.DataFrame(data)
frame.set_index('Seniority', inplace=True)
ax = frame.plot(kind='bar', stacked='True', figsize=(8, 6), rot=0, ylabel='Job Count')
ax.set_title('Seniority and Job Count', size=20, fontweight="bold")
ax.legend(loc=(1.01, 0))
ax.tick_params(axis='x', colors='red', which='both')
ax.tick_params(axis='y', colors='purple', which='both')
plt.show()
修复现有代码
- 绘图创建有许多问题
- 为许多地块指定的
y不正确 bottom没有根据上一节的y正确创建Financials + 'consumer staples'是导致错误的直接原因。'Consumer_Staples'不应添加到graphconsumerstaples绘图的bottom。
 - 为许多地块指定的
 
# change setting the index because it's not assigned in the OP
frame.set_index('Seniority', inplace=True)
# fix the plotting section and everything else works fine
graphInformationTechnology = plt.bar(Seniority, Information_Technology ,0.35 ,color = '#FF0000' ,label = "Information Technology") 
graphIndustrials = plt.bar(Seniority, Industrials, 0.35 , bottom = Information_Technology ,color = '#ffff00' ,label ="Industrials")
graphHealthCare = plt.bar(Seniority,Health_Care, 0.35 , bottom = Information_Technology + Industrials ,color = '#0000FF' ,label ="Health Care")
graphCommunication = plt.bar(Seniority, Communication, 0.35 , bottom = Information_Technology + Industrials + Health_Care ,color = 'orange' ,label ="Communication")
graphFinancials = plt.bar(Seniority, Financials, 0.35 , bottom = Information_Technology + Industrials + Health_Care + Communication ,color = 'green' ,label ="Financials")
graphconsumerstaples = plt.bar(Seniority, Consumer_Staples, 0.35 , bottom = Information_Technology + Industrials + Health_Care + Communication + Financials ,color = 'purple' ,label ="Consumer Staples")
                        这篇关于如何从宽数据帧创建堆叠条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:如何从宽数据帧创建堆叠条形图
				
        
 
            
        基础教程推荐
             猜你喜欢
        
	     - 求两个直方图的卷积 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - 包装空间模型 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 - PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - 修改列表中的数据帧不起作用 2022-01-01
 - 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				