我正在试用 Python 的
ascii_graph
包。 如果我使用 numpy.arange
和 zip
组合直方图数据,则绘图失败。 如果我从原始文字组装数据,它就会成功。 谁能解释一下有什么区别吗?
import numpy as np
BinMid = np.arange(20) + 1 # Bin edges
BinEdge = np.arange(21) + 0.5 # Bin mid-oints
nDist = np.array( # Bin counts
[ 7083, 73485, 659204, 3511238, 10859771, 22162510,
34511661, 45891902, 55651178, 59153091, 56242073,
48598282, 37947325, 27541907, 19356046, 13630601,
8810979, 4262462, 1227506, 216751], dtype=np.int64 )
# Histogram data
histData = list( zip( BinMid.astype(str) , nDist ) )
# [('1', 7083),
# ('2', 73485),
# ('3', 659204),
# ('4', 3511238),
# ('5', 10859771),
# ('6', 22162510),
# ('7', 34511661),
# ('8', 45891902),
# ('9', 55651178),
# ('10', 59153091),
# ('11', 56242073),
# ('12', 48598282),
# ('13', 37947325),
# ('14', 27541907),
# ('15', 19356046),
# ('16', 13630601),
# ('17', 8810979),
# ('18', 4262462),
# ('19', 1227506),
# ('20', 216751)]
# Create ASCII histograph plotter
from ascii_graph import Pyasciigraph
graph = Pyasciigraph()
# FAILS: Plot using zip expression assigned to histData
#------------------------------------------------------
for line in graph.graph( "Test" ,
list( zip( BinMid.astype(str) , nDist ) ) ):
print(line)
for line in graph.graph( "Test" , histData ): print(line)
# Traceback (most recent call last):
# Cell In[139], line 1
# for line in graph.graph( "Test" , histData ): print(line)
# File ~\AppData\Local\anaconda3\envs\py39\lib\site-packages\ascii_graph\__init__.py:399 in graph
# san_data = self._sanitize_data(data)
# File ~\AppData\Local\anaconda3\envs\py39\lib\site-packages\ascii_graph\__init__.py:378 in _sanitize_data
# (self._sanitize_string(item[0]),
# File ~\AppData\Local\anaconda3\envs\py39\lib\site-packages\ascii_graph\__init__.py:351 in _sanitize_string
# return info
# UnboundLocalError: local variable 'info' referenced before assignment
# SUCCEEDS: Assign pimitive literals to histData
#-----------------------------------------------
histData = [ ('1', 7083),
('2', 73485),
('3', 659204),
('4', 3511238),
('5', 10859771),
('6', 22162510),
('7', 34511661),
('8', 45891902),
('9', 55651178),
('10', 59153091),
('11', 56242073),
('12', 48598282),
('13', 37947325),
('14', 27541907),
('15', 19356046),
('16', 13630601),
('17', 8810979),
('18', 4262462),
('19', 1227506),
('20', 216751) ]
for line in graph.graph( "Test" , histData ): print(line)
# Test
# ###############################################################################
# 7083 1
# 73485 2
# 659204 3
# ███ 3511238 4
# ███████████ 10859771 5
# ████████████████████████ 22162510 6
# █████████████████████████████████████ 34511661 7
# ██████████████████████████████████████████████████ 45891902 8
# █████████████████████████████████████████████████████████████ 55651178 9
# █████████████████████████████████████████████████████████████████ 59153091 10
# █████████████████████████████████████████████████████████████ 56242073 11
# █████████████████████████████████████████████████████ 48598282 12
# █████████████████████████████████████████ 37947325 13
# ██████████████████████████████ 27541907 14
# █████████████████████ 19356046 15
# ██████████████ 13630601 16
# █████████ 8810979 17
# ████ 4262462 18
# █ 1227506 19
# 216751 20
看起来这些字符串的类型最终是
numpy.str_
而不是 str
。
>>> histData = list( zip( BinMid.astype(str) , nDist ) )
>>> print(type(histData[0][0]))
<class 'numpy.str_'>
与字面定义相比:
>>> histData2 = [('1', 7083), ('2', 73485)]
>>> print(type(histData2[0][0]))
<class 'str'>
我建议使用一种为您提供
str
对象的方法。
histData = list(zip(map(str, BinMid), nDist))
有了这个,我就可以从 NumPy 数组制作图表了。