Отклонить входящие звонки с помощью AT-команд (Blox LARA-R211)

Итак, я в конце концов нашел трюк (изменить: см. ниже для использования морского и длинного фреймов данных):

Решение с помощью pandas и matplotlib

Здесь приводится более полный пример :

import pandas as pd
import matplotlib.cm as cm
import numpy as np
import matplotlib.pyplot as plt

def plot_clustered_stacked(dfall, labels=None, title="multiple stacked bar plot",  H="/", **kwargs):
    """Given a list of dataframes, with identical columns and index, create a clustered stacked bar plot. 
labels is a list of the names of the dataframe, used for the legend
title is a string for the title of the plot
H is the hatch used for identification of the different dataframe"""

    n_df = len(dfall)
    n_col = len(dfall[0].columns) 
    n_ind = len(dfall[0].index)
    axe = plt.subplot(111)

    for df in dfall : # for each data frame
        axe = df.plot(kind="bar",
                      linewidth=0,
                      stacked=True,
                      ax=axe,
                      legend=False,
                      grid=False,
                      **kwargs)  # make bar plots

    h,l = axe.get_legend_handles_labels() # get the handles we want to modify
    for i in range(0, n_df * n_col, n_col): # len(h) = n_col * n_df
        for j, pa in enumerate(h[i:i+n_col]):
            for rect in pa.patches: # for each index
                rect.set_x(rect.get_x() + 1 / float(n_df + 1) * i / float(n_col))
                rect.set_hatch(H * int(i / n_col)) #edited part     
                rect.set_width(1 / float(n_df + 1))

    axe.set_xticks((np.arange(0, 2 * n_ind, 2) + 1 / float(n_df + 1)) / 2.)
    axe.set_xticklabels(df.index, rotation = 0)
    axe.set_title(title)

    # Add invisible data to add another legend
    n=[]        
    for i in range(n_df):
        n.append(axe.bar(0, 0, color="gray", hatch=H * i))

    l1 = axe.legend(h[:n_col], l[:n_col], loc=[1.01, 0.5])
    if labels is not None:
        l2 = plt.legend(n, labels, loc=[1.01, 0.1]) 
    axe.add_artist(l1)
    return axe

# create fake dataframes
df1 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df2 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df3 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"], 
                   columns=["I", "J", "K", "L", "M"])

# Then, just call :
plot_clustered_stacked([df1, df2, df3],["df1", "df2", "df3"])

И это дает следующее:

multiple stacked bar plot [/g3]

Вы можете изменить цвета полосы, передав cmap:

plot_clustered_stacked([df1, df2, df3],
                       ["df1", "df2", "df3"],
                       cmap=plt.cm.viridis)

Решение с морским транспортом:

Учитывая тот же самый df1, df2, df3, я преобразую их в длинной форме:

df1["Name"] = "df1"
df2["Name"] = "df2"
df3["Name"] = "df3"
dfall = pd.concat([pd.melt(i.reset_index(),
                           id_vars=["Name", "index"]) # transform in tidy format each df
                   for i in [df1, df2, df3]],
                   ignore_index=True)

Проблема с морским суннитом заключается в том, что он не складывает бары изначально, поэтому трюк заключается в построении совокупной суммы каждого бара друг над другом:

dfall.set_index(["Name", "index", "variable"], inplace=1)
dfall["vcs"] = dfall.groupby(level=["Name", "index"]).cumsum()
dfall.reset_index(inplace=True) 

>>> dfall.head(6)
  Name index variable     value       vcs
0  df1     A        I  0.717286  0.717286
1  df1     B        I  0.236867  0.236867
2  df1     C        I  0.952557  0.952557
3  df1     D        I  0.487995  0.487995
4  df1     A        J  0.174489  0.891775
5  df1     B        J  0.332001  0.568868

Затем цикл над каждой группой variable и нарисуйте кумулятивную сумму:

c = ["blue", "purple", "red", "green", "pink"]
for i, g in enumerate(dfall.groupby("variable")):
    ax = sns.barplot(data=g[1],
                     x="index",
                     y="vcs",
                     hue="Name",
                     color=c[i],
                     zorder=-i, # so first bars stay on top
                     edgecolor="k")
ax.legend_.remove() # remove the redundant legends 

В нем отсутствует легенда, которую можно легко добавить. Проблема заключается в том, что вместо люков (которые могут быть легко добавлены), чтобы отличать данные, мы имеем градиентность легкости, и это слишком мало для первого, и я действительно не знаю, как изменить это, не меняя каждый прямоугольник один за другим (как в первом решении).

Скажите, если вы что-то не поняли в коде.

Не забудьте повторно использовать этот код, который находится под СС0.

0
задан Martin Rasmussen 2 April 2019 в 09:33
поделиться

2 ответа

У меня недостаточно репутации, чтобы добавить комментарий к предыдущему ответу.

Но если это правда, что входящие звонки не могут быть заблокированы, если PIN-код на используемой SIM-карте деактивирован, возможно, вы можете:

  1. Активировать временно PIN-код на SIM-карте, выдав ' AT + CLCK = "SC", 1, TEMP_PIN '
  2. Выполнить команду (-и), использовавшуюся для вызова ОШИБКИ (например, AT + CLCK = "AI", 0, TEMP_PIN)
  3. [ 113] Снова отмените проверку PIN-кода, введя 'AT + CLCK = "SC", 0, TEMP_PIN'

PS: не слишком полагайтесь на многословную ошибку, разрешенную с + CMEE = 1 / 2, потому что это часто неточно. «+ CME ERROR: 100» звучит как типичный резервный код ошибки . Это верно для каждого производителя модема.

0
ответ дан Cubo78 2 April 2019 в 09:33
поделиться

Для тех, кого это может заинтересовать:

Для функций, упомянутых выше, требуется пароль, и кажется, что этот конкретный модуль не может обрабатывать любые зависящие от пароля команды, если PIN-код на используемой SIM-карте деактивируется. Я полагаю, поскольку по умолчанию для пароля установлен PIN-код SIM-карты, модуль не может сравнивать пароль, введенный в команде, с PIN-кодом, и поэтому возвращает «неправильный пароль», что делает все пароли в зависимости от использования неиспользуемыми.

Я связался с производителями модуля, так что, надеюсь, они исправят эту ошибку в будущих продуктах, если мои предположения верны.

Другое решение, которое я нашел, чтобы работать аналогично, это использовать команду AT+CGCLASS='CG'

0
ответ дан Martin Rasmussen 2 April 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: