我有一个由Networkx创建的无向图,我使用pyplot显示,我想让用户指定网格线之间的间距。我不想手动输入刻度,因为这需要知道绘图的最终大小(如果有我想知道的方法),这可能会根据显示的图表而有所不同。 / p>
是否有任何方法可以设置间距量?我已经找了一会儿,找不到任何东西,谢谢。
以下代码涉及创建情节而不是图表。
#Spacing between each line
intervals = float(sys.argv[1])
nx.draw(displayGraph, pos, node_size = 10)
plt.axis('on')
plt.grid('on')
plt.savefig("test1.png")
我需要找到一种方法让网格具有由用户定义的间隔间隔。我已经找到了做到这一点的方法,但它还依赖于你想要多少网格线,这会导致线条在图上不均匀分布
答案 0 :(得分:12)
您可以使用ticker为网格设置tick locations。用户可以指定MultipleLocator的输入,该输入将“在视图间隔中设置每个整数倍的整数。”这是一个例子:
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
if (position == 0)
v = vi.inflate(R.layout.list_item_chat_list_header, parent, false);
else
v = vi.inflate(R.layout.list_item_chat_list, parent, false);
}
TextView tvName = ((TextView) v.findViewById(R.id.id_chat_list_name));
TextView tvPreview = ((TextView) v.findViewById(R.id.id_chat_list_preview));
if ( tvName != null && tvPreview != null ) {
ChatListElement p = getItem(position);
tvName.setText(p.name);
String preview = p.lastMessage;
if (preview.length() > 30)
preview = preview.substring(0, 30) + "...";
tvPreview.setText(preview);
}
return v;
修改
要将其与Networkx一起使用,您可以使用上面的子图(或其他一些函数)创建轴,并将这些轴传递给draw,如下所示。
from matplotlib import pyplot as plt
from matplotlib.ticker import MultipleLocator
import numpy as np
# Two example plots
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
spacing = 0.5 # This can be your user specified spacing.
minorLocator = MultipleLocator(spacing)
ax1.plot(9 * np.random.rand(10))
# Set minor tick locations.
ax1.yaxis.set_minor_locator(minorLocator)
ax1.xaxis.set_minor_locator(minorLocator)
# Set grid to use minor tick locations.
ax1.grid(which = 'minor')
spacing = 1
minorLocator = MultipleLocator(spacing)
ax2.plot(9 * np.random.rand(10))
# Set minor tick locations.
ax2.yaxis.set_minor_locator(minorLocator)
ax2.xaxis.set_minor_locator(minorLocator)
# Set grid to use minor tick locations.
ax2.grid(which = 'minor')
plt.show()
或者您可以像在问题中一样调用nx.draw,然后使用gca获取当前轴:
nx.draw(displayGraph, pos, ax=ax1, node_size = 10)
答案 1 :(得分:11)
不确定这是否违反了您不想手动使用刻度线的愿望,但您可以使用matplotlib.ticker
将刻度设置为给定的间隔:
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
fig,ax=plt.subplots()
#Spacing between each line
intervals = float(sys.argv[1])
loc = plticker.MultipleLocator(base=intervals)
ax.xaxis.set_major_locator(loc)
ax.yaxis.set_major_locator(loc)
# Add the grid
ax.grid(which='major', axis='both', linestyle='-')
答案 2 :(得分:0)
例如,您可以使用xlim
来获取x轴的范围,并且使用用户指定的间隔,您应该能够使用ax.axvline
自己绘制网格,如本例所示{{3 }}
(编辑)这里是一个样本。
from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3, 15],[2,3,4, 25],'ro')
xmin,xmax = xlim()
user_interval = 1.5
for _x in np.arange(xmin, xmax, user_interval):
ax.axvline(x=_x, ls='-')
draw()