Python matplotlib能否生成X==0作为有效数据点的日志条形图?
我想创建一个条形图,其中X轴将包括数十万个数据点 因此,我需要使用对数标度。唉,Python matplotlib能否生成X==0作为有效数据点的日志条形图?,python,matplotlib,plot,bar-chart,logarithm,Python,Matplotlib,Plot,Bar Chart,Logarithm,我想创建一个条形图,其中X轴将包括数十万个数据点 因此,我需要使用对数标度。唉,X==0是一个有效的数据点。 顺便说一句,Y轴应该使用线性刻度(其中Y是分布,00 else epsilon for k in\u graph]应该可以解决你的问题。顺便说一句:log是自然对数(以e为基数),你必须使用log10事实上你可能想使用:x=[k如果abs(k)>0,其他ε表示图中的k](如果你也有负数)谢谢你的建议。他们确实在一定程度上改善了情况,但输出图似乎仍然错误。请参阅我的作品中的EDIT 1。@
X==0
是一个有效的数据点。顺便说一句,Y轴应该使用线性刻度(其中Y是分布,
0symlog
而不是log,其中包括负数和一个接近零的小线性区域。例如
#!/usr/bin/env python
def test_plot3():
import pylab as pl
_graph = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
epsilon = 0.00000000001
x = [ pl.log(k) if k > 0 else pl.log(epsilon) for k in _graph ]
y = [ _graph[k] for k in _graph ]
lx = pl.xlabel("in degree (logarithmic scale)")
ly = pl.ylabel("normalized distribution (0 to 1)")
tl = pl.title("graph in-degree normalized distribution")
_width = 1.0 / (len(x) * 5.0)
pl.bar(x, y, width=_width, log=True)
pl.xscale('symlog')
pl.yscale('linear')
pl.show()
if __name__ == "__main__":
test_plot3()
您可以使用linthreshx
参数将线性区域的大小调整为xscale
。
有关如何使用它的详细信息,请查看此文件。您可以使用
symlog
而不是log,log包括负数和一个接近零的小线性区域。例如
#!/usr/bin/env python
def test_plot3():
import pylab as pl
_graph = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
epsilon = 0.00000000001
x = [ pl.log(k) if k > 0 else pl.log(epsilon) for k in _graph ]
y = [ _graph[k] for k in _graph ]
lx = pl.xlabel("in degree (logarithmic scale)")
ly = pl.ylabel("normalized distribution (0 to 1)")
tl = pl.title("graph in-degree normalized distribution")
_width = 1.0 / (len(x) * 5.0)
pl.bar(x, y, width=_width, log=True)
pl.xscale('symlog')
pl.yscale('linear')
pl.show()
if __name__ == "__main__":
test_plot3()
您可以使用linthreshx
参数将线性区域的大小调整为xscale
。
有关如何使用它的详细信息,请查看此项。您可以选择一个:将0置于对数缩放轴上,或获取正确的图形。您不能同时拥有这两个图形。您可以选择一个:将0置于对数缩放轴上,或获取正确的图形。您不能同时拥有这两个图形。谢谢您的建议。他们确实在一定程度上改善了这种情况,但输出图形似乎仍然错误。请参阅
EDIT 1
在我的作品@boardrider中,当你使用日志缩放轴(或symlog)时,你不必自己应用日志函数。只需传递值,matplotlib就会自动应用日志。因此基本上使用:x=[k if k>0 else epsilon for k in\u graph]
应该可以解决你的问题。顺便说一句:log
是自然对数(以e为基数),你必须使用log10
事实上你可能想使用:x=[k如果abs(k)>0,其他ε表示图中的k]
(如果你也有负数)谢谢你的建议。他们确实在一定程度上改善了情况,但输出图似乎仍然错误。请参阅我的作品中的EDIT 1
。@boardrider当你使用日志缩放轴(或symlog)时,你不必自己应用日志函数。只需传递这些值,matplotlib就会自动应用日志。因此基本上使用:x=[k if k>0 else epsilon for k in _graph]
应该可以解决您的问题。顺便说一句:log
是自然对数(带基数e),您必须使用log10
事实上您可能想使用:x=[k if abs(k)>0 else epsilon for k in _graph]
(如果您还有负数)
#!/usr/bin/env python
def test_plot3():
import pylab as pl
_graph = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
epsilon = 0.00000000001
x = [ pl.log(k) if k > 0 else pl.log(epsilon) for k in _graph ]
y = [ _graph[k] for k in _graph ]
lx = pl.xlabel("in degree (logarithmic scale)")
ly = pl.ylabel("normalized distribution (0 to 1)")
tl = pl.title("graph in-degree normalized distribution")
_width = 1.0 / (len(x) * 5.0)
pl.bar(x, y, width=_width, log=True)
pl.xscale('symlog')
pl.yscale('linear')
pl.show()
if __name__ == "__main__":
test_plot3()