【问题标题】:Matplotlib: unsupported operand type(s) for -: 'list' and 'float'Matplotlib:不支持的操作数类型 -:'list' 和 'float'
【发布时间】:2015-09-10 15:11:10
【问题描述】:

我正在尝试使用 matplotlib 创建多条形图。

from sqlalchemy import create_engine
import _mssql
from matplotlib import pyplot as plt
import numpy as np


engine = create_engine('mssql+pymssql://sa:california851101@127.0.0.1:1433/AffectV_Test')
connection = engine.connect()
result = connection.execute('SELECT pa.[Date],pa.[Type],(CAST((SUM(pa.Actions_Logged)/SUM(pi.Impressions_Served))*100 AS Decimal(4,4))) AS Daily_Action_Rate from Performance_Actions pa INNER JOIN Performance_Impressions pi ON pa.Alternative = pi.Alternative AND pa.[Date] = pi.[Date] GROUP BY [Type],pa.[Date] ORDER BY pa.[Date] ASC')

click = []
conversion = []
landing = []
xTickMarks = []

for row in result:
    if row[1] == 'click':
        click.append(str(row[2]))
    elif row[1] == 'conversion':
        conversion.append(str(row[2]))
    else:
        landing.append(str(row[2]))
    xTickMarks.append(str(row[0]))



connection.close()

ax = plt.subplot(111)
w = 0.3
ax.bar(xTickMarks-w, click,width=w,color='b',align='center')
ax.bar(xTickMarks, conversion,width=w,color='g',align='center')
ax.bar(xTickMarks+w, landing,width=w,color='r',align='center')
ax.xaxis_date()
ax.autoscale(tight=True)

plt.show()

当我尝试运行代码时出现以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-63-8a9e652a1846> in <module>()
     32 ax = plt.subplot(111)
     33 w = 0.3
     ---> 34 ax.bar(xTickMarks-w, click,width=w,color='b',align='center')
     35 ax.bar(xTickMarks, conversion,width=w,color='g',align='center')
     36 ax.bar(xTickMarks+w, landing,width=w,color='r',align='center')

TypeError: unsupported operand type(s) for -: 'list' and 'float'

尝试将列表转换为 numpy 数组,不行。

以上代码的结果数据集为:

01/04/2015  click       0.0036
01/04/2015  conversion  0.0010
01/04/2015  landing     0.0058
02/04/2015  click       0.0132
02/04/2015  conversion  0.0014
02/04/2015  landing     0.0104

参考问题Question

【问题讨论】:

  • xTickMarksstrings 组成...那么您打算通过减去float 来做什么?
  • 我不确定。我使用了 Matpotlib 示例中给出的模板。可能应该再次检查。

标签: python numpy matplotlib


【解决方案1】:

如果你的xTickMarks 中有strings,我想你想这样做

ax.bar([float(x)-w for x in xTickMarks], ...)

如果xTickMarks 包含浮点数,您也可以这样做

ax.bar([x-w for x in xTickMarks], ...)

xTickMarks = np.asarray(xTickMarks)
ax.bar(xTickMarks-w, ...)

【讨论】:

  • 现在我有错误invalid literal for float(): 2015-04-01
  • @TauseefHussain :那么您在此列表中有 xticklabels ......不是位置......据我所知 ax.bar 不是那样工作的。看看this example
  • @TauseefHussain:我现在没有太多时间......也许我可以稍后提出解决方案。
  • 感谢您的帮助。我正在研究它,如果我找到解决方案,我会在这里提出。
【解决方案2】:

xTickMarks 是一个列表。

xTickMarks-w 在您尝试从列表中减去浮点数 (w = 0.3) 时引发异常。

如果你想从xTickMarks 的每个元素中减去0.3,那么你应该使用plonsers 方法。

【讨论】:

    【解决方案3】:

    对于 ax.bar(xTickMarks-w, click,width=w,color='b',align='center') 这工作。

    你可以这样尝试:

    index = np.arrange(len(xTickMarks))
    ax = plt.subplot(111)
    
    plt.xticks(index, xTickMarks, fontsize = 9)
    
    
    w = 0.3
    ax.bar(index-w, click,width=w,color='b',align='center')
    ax.bar(index, conversion,width=w,color='g',align='center')
    ax.bar(index+w, landing,width=w,color='r',align='center')
    

    这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多