我有一个numpy数组列表,每个数组可能有不同数量的元素,例如:
[array([55]),
array([54]),
array([], dtype=float64),
array([48, 55]),]
我想绘制这个,其中每个数组都指定了横坐标(x值),例如[1,2,3,4]
,以便绘图应显示以下几点:[[1,55], [2, 54], [4, 48], [4, 55]]
。
有没有办法用matplotlib做到这一点?或者我如何首先使用numpy或pandas转换数据,以便可以绘制它?
答案 0 :(得分:5)
你想要做的是链接原始数组并生成一个带有“abscissas”的新数组。有许多方法可以连接,其中最有效的方法是使用 itertools.chain 。
import itertools
from numpy import array
x = [array([55]), array([54]), array([]), array([48, 55])]
ys = list(itertools.chain(*x))
# this will be [55, 54, 48, 55]
# generate abscissas
xs = list(itertools.chain(*[[i+1]*len(x1) for i, x1 in enumerate(x)]))
现在您可以使用matplotlib轻松绘图,如下所示
import matplotlib.pyplot as plt
plt.plot(xs, ys)
答案 1 :(得分:1)
如果您想为不同的数据组设置不同的标记(颜色会自动按matplotlib
循环):
import numpy as np
import matplotlib.pyplot as plt
markers = ['o', #'circle',
'v', #'triangle_down',
'^', #'triangle_up',
'<', #'triangle_left',
'>', #'triangle_right',
'1', #'tri_down',
'2', #'tri_up',
'3', #'tri_left',
'4', #'tri_right',
'8', #'octagon',
's', #'square',
'p', #'pentagon',
'h', #'hexagon1',
'H', #'hexagon2',
'D', #'diamond',
'd', #'thin_diamond'
]
n_markers = len(markers)
a = [10.*np.random.random(int(np.random.random()*10)) for i in xrange(n_markers)]
fig = plt.figure()
ax = fig.add_subplot(111)
for i, data in enumerate(a):
xs = data.shape[0]*[i,] # makes the abscissas list
marker = markers[i % n_markers] # picks a valid marker
ax.plot(xs, data, marker, label='data %d, %s'%(i, marker))
ax.set_xlim(-1, 1.4*len(a))
ax.set_ylim(0, 10)
ax.legend(loc=None)
fig.tight_layout()
请注意,y
比例的限制是硬编码的,因此会相应更改。 1.4*len(a)
旨在为图例的图表右侧留出空间。
上面的示例在x=0
(将是深蓝色圆圈)中没有任何意义,因为其数据集的随机分配大小为零,但如果您不这样做,则可以轻松放置+1
我想使用x=0
。
答案 2 :(得分:1)
当数组为空或短于列表中最长的数组时,使用pandas创建一个nansy数组,插入nans ...
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
arr_list = [np.array([55]),
np.array([54]),
np.array([], dtype='float64'),
np.array([48, 55]),]
df = pd.DataFrame(arr_list)
list_len = len(df)
repeats = len(list(df))
vals = df.values.flatten()
xax = np.repeat(np.arange(list_len) + 1, repeats)
df_plot = pd.DataFrame({'xax': xax, 'vals': vals})
plt.scatter(df_plot.xax, df_plot.vals);
答案 3 :(得分:0)
以public class OrmLiteDbHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "Database_db";
private static final int DATABASE_VERSION = 1;
public SQLiteDatabase sqLiteDatabase;
private Context mContext;
public OrmLiteDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = mContext;
try {
sqLiteDatabase = getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
sqLiteDatabase = database;
try {
TableUtils.createTable(connectionSource, TableSet.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource,
int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource, TableSet.class, false);
onCreate(database, connectionSource);}catch (Exception e){ e.printStackTrace();}
}
列表:
x
答案 4 :(得分:0)